2013-03-24 367 views
0

我正在kubuntu 12.10下开发一个应用程序,我需要在QIODevice中生成一些声音,然后用QAudioOutput播放它。Qt5 QAudioOutput没有产生任何声音

我已经阅读了所有关于如何正确地做到这一点的文献,并且我认为已经这样做了。

到目前为止,我已经做了:

QVector <double> * soundData = SoundGenerator::getSound(); 

soundBuffer->open(QIODevice::ReadWrite); 
QDataStream writeStream(soundBuffer); 
foreach(double d, *soundData) { 
    char value = d * (2 << 7); 
    // qDebug() << "Value : " << (short int)value; 
    writeStream << value; 
} 

QAudioFormat format; 
// Set up the format, eg. 
format.setSampleRate(SoundGenerator::getAudioSampleRate()); 
format.setChannelCount(1); 
format.setSampleSize(8); 
format.setCodec("audio/pcm"); 
format.setByteOrder(QAudioFormat::LittleEndian); 
format.setSampleType(QAudioFormat::SignedInt); 
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice()); 

audio = new QAudioOutput(format, this); 
if (audio->error() != QAudio::NoError) { 
    qDebug() << "Problem playing sound"; 
} 

connect(audio, SIGNAL(stateChanged(QAudio::State)), this, SLOT(aboutToFinish(QAudio::State))); 

我还打电话给 音频>启动(soundBuffer)

- 从另一个插槽 我没有在任何错误初始化QAudioOutput

而且我没有声音(所有其他应用程序都有声音,并且我将一个Qt4应用程序移植到Qt5,Qt4中一切正常)Phonon

aboutToFinish插槽在ActiveState作为状态开始时调用,NoError在调用QAudioOutput :: error时调用,但它不再被调用,即使等待远远超过预期的生成声音持续时间。

声音生成过程不会受到质疑,它已通过编写wav文件进行测试,并且可以正常工作。另外,我从Qt的源文件中构建了多媒体例子,当涉及到纯音频时没有输出(例如在sprectrum示例中),另一方面,视频完美地播放声音。

有没有什么已知的问题呢?这是一个错误?难道我做错了什么 ?

在此先感谢;)

+0

你打电话'QAudi oDeviceInfo :: supportedCodecs()const'?我很欣赏所有平台都应该支持'audio/pcm'',但这里的关键字是**应该** ... – cmannett85 2013-03-24 10:06:12

+0

嗨,我已经调用它并且audio/pcm在支持的编解码器列表中 – user2203624 2013-03-25 21:04:14

+0

sudo apt- get install libqt5multimedia5-plugins http://stackoverflow.com/questions/21939759/qaudiodeviceinfo-finds-no-default-audio-device-on-ubuntu – 2016-06-02 01:50:08

回答

1

这不工作,因为你已经设置8位采样大小和符号整数格式。

SOLUTION:你必须设置8位分辨率的样品类型为无符号:

format.setSampleType(QAudioFormat::UnsignedInt); 

这不是一个Qt的bug。为什么?答案是,在WAV规范中,8位样本总是无符号的,而16位样本总是有符号的。任何其他组合都不起作用。

因此,对于16位样本,你将不得不把:

format.setSampleType(QAudioFormat:SignedInt); 

(恕我直言,事实上,Qt不采取强制格式正确处理这些案件保健是一个缺陷,但不是缺乏functionnality)。

您可以了解更多关于此在这个页面的注释部分:https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

而且还解决这个非常类似的问题(同样的问题,但与16位):Qt QAudioOutput push mode

1

尝试添加:

QEventLoop loop;

loop.exec();