当前位置:编程学习 > wap >>

写录音程序出现“using null input device, none available”无法录音,新手求教

写录音程序出现“using null input device, none available”无法录音,新手求教
代码如下
widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}
void Widget::stopRecording()
{
    audio->stop();
    outputFile.close();
    delete audio;
    cout <<"record end!" << endl;
}

void Widget::on_record_clicked()  //recod
{
    outputFile.setFileName("/test.raw");
    outputFile.open( QIODevice::WriteOnly | QIODevice::Truncate );
    QAudioFormat format;
    // set up the format you want, eg.
    format.setFrequency(8000);
    format.setChannels(1);
    format.setSampleSize(8);
    format.setCodec("audio/pcm");
    format.setByteOrder(QAudioFormat::LittleEndian);
    format.setSampleType(QAudioFormat::UnSignedInt);
    QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice();
    if (!info.isFormatSupported(format)) {
       qWarning()<<"default format not supported try to use nearest";
       format = info.nearestFormat(format);
    }
    audio = new QAudioInput(format, this);
    QTimer::singleShot(10000, this, SLOT(stopRecording()));
    audio->start(&outputFile);
    // Records audio for 10000ms
     cout <<"record begin!" << endl;
}
void Widget::on_play_clicked()   //play
{
    inputFile.setFileName("/test.wav");
    inputFile.open(QIODevice::ReadOnly);

    QAudioFormat format2;
    // Set up the format, eg.
    format2.setFrequency(8000);
    format2.setChannels(1);
    format2.setSampleSize(8);
    format2.setCodec("audio/pcm");
    format2.setByteOrder(QAudioFormat::LittleEndian);
    format2.setSampleType(QAudioFormat::UnSignedInt);
    QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
    if (!info.isFormatSupported(format2)) {
     qWarning()<<"raw audio format not supported by backend, cannot play audio.";
    // return;
    }
    audioOutput = new QAudioOutput(format2, this);
    connect(audioOutput,SIGNAL(stateChanged(QAudio::State)),SLOT(finishedPlaying(QAudio::State)));
    audioOutput->start(&inputFile);
    cout <<"play begin!" << endl;

}
void Widget::finishedPlaying(QAudio::State state)  //finish playing
 {
   if(state == QAudio::IdleState) {
     audioOutput->stop();
     inputFile.close();
     delete audioOutput;
   }
   cout << "play end!" << endl;
 }

Widget::~Widget()  //finish porgm
{
    delete ui;
}


widget.h


#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QtGui>
#include <QAudioInput>  //QT += multimedia?
#include <QAudioOutput>
#include <iostream>
using namespace std;

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT
    
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    
private slots:
    void on_play_clicked();
    void on_record_clicked();
    void finishedPlaying(QAudio::State state);
    void stopRecording();  

  //void on_pushButton_clicked();

private:
    Ui::Widget *ui;
    QFile outputFile;   // class member.
    QAudioInput* audio; // class member.
    QAudioOutput* audioOutput;
    QFile inputFile;   // class member.
};

#endif // WIDGET_H


编译结果无错但是出现
default format not supported try to use nearest
record begin
record end

点击开始播放
出现
play begin
play end
但是存储的test文件为0kb


若把播放路径换成根目录下本来就有的音乐路径,也播放不出来。
新手求解答。


--------------------编程问答-------------------- 修改程序检查了,说是没有可用的设备,怎么解决?是不是声卡驱动没装?但是如直接通过板子播放音乐是可以发声的???
--------------------编程问答-------------------- 就是驱动没安装

Qt貌似是通过调用oss来实现的
所以需要安装OSS。 --------------------编程问答--------------------
引用 2 楼 qq214517703 的回复:
就是驱动没安装

Qt貌似是通过调用oss来实现的
所以需要安装OSS。

新手再求问,如果是驱动没安装,是什么的驱动?声卡的驱动吗?那么直接播放根目录下的歌曲为什么能放出声音来呢? --------------------编程问答-------------------- 跟楼主一样的问题,不知道有木有人知道 啊 --------------------编程问答-------------------- 这个问题我也遇上了,按以下步骤解决:
1 下载alsa的开发包并安装  先查看内核中alsa driver版本:alsactl -v. 再到官方网站www.alsa-project.org/下载对应的开发包 开发包在ftp://ftp.alsa-project.org/pub/lib/  解压后./configure make install直接就可以安装上
2 重新编译qt库, ./configure -multimedia -v > out.txt   configure完之后在文件out.txt中查看有无这一行字Alsa support ........... yes    如果为yes,则步骤1中的开发包装成功了的,如果为no,则步骤1可能有问题        楼主出现的问题是因为没有执行步骤1.        之后make make install都是一样的
各位好运
补充:移动开发 ,  Qt
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,