写录音程序出现“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。 --------------------编程问答--------------------
新手再求问,如果是驱动没安装,是什么的驱动?声卡的驱动吗?那么直接播放根目录下的歌曲为什么能放出声音来呢? --------------------编程问答-------------------- 跟楼主一样的问题,不知道有木有人知道 啊 --------------------编程问答-------------------- 这个问题我也遇上了,按以下步骤解决:
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