2013-03-24 110 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();