2016-10-12 54 views
0
int main(int argc, char *argv[]) 
{ 
    QCoreApplication b(argc, argv); 

    QBuffer *buffer; 
    QAudioOutput *a; 

    QAudioFormat format; 
    format.setSampleRate(8000); 
    format.setChannelCount(1); 
    format.setSampleSize(8); 
    format.setCodec("audio/pcm"); 
    format.setByteOrder(QAudioFormat::LittleEndian); 
    format.setSampleType(QAudioFormat::UnSignedInt); 

    QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice()); 
    if (info.isFormatSupported(format)) 
    { 
     cout << "Format supported" << endl; 
    } 
    else 
    { 
     cout << "Format not supported" << endl; 
    } 

    char *data = (char*)malloc(32768 * sizeof(char)); 

    //generating a sound 
    for (int i = 0; i<256; ++i) 
    { 
     for (int j = 0; j<128; ++j) 
     { 
      data[i * 128 + j] = (char)j; 
     } 
    } 

    cout << "Created samples" << endl; 

    //copying into the buffer 
    buffer = new QBuffer; 
    buffer->open(QIODevice::ReadWrite); 
    buffer->seek(0); 
    buffer->write(data, 32768); 
    cout << "Filled buffer" << endl; 

    //playing 
    QThread thr; 
    a = new QAudioOutput(format); 
    //a->moveToThread(&thr); 

    //thr.start(); 
    //QMetaObject::invokeMethod(a, "start", Q_ARG(QIODevice*, buffer)); 

    a->start(buffer); 

    system("pause"); 

    return b.exec(); 
} 

我想讓我的控制檯應用程序輸出聲音,我不知道爲什麼我的QAudioOutput對象不這樣做。我放置了上面的代碼。你能告訴我我做錯了什麼嗎? P.S.如果我將該矢量寫入文件並以原始聲音播放,我可以聽到低頻嗡嗡聲。如何從緩衝區中播放QAudioOutput對象?

+0

我不確定你是否需要這個主循環。但是你不應該在exec之前「暫停」。 exec將啓動Qt內部主線程。所以這可能是因爲這個原因。 – Hayt

+0

這沒有奏效。不管怎麼說,還是要謝謝你。 –

+0

有可能(閱讀文檔,他們可能會這樣說)你需要'QGuiApplication'或'QApplication'來使音頻工作。那麼,你打算如何退出你的申請?您可能希望將相關的音頻信號連接到'qApp'的'quit()'插槽。 – hyde

回答

0

首先,你肯定不應該在你的主循環之前有@@@ @ @ @ @ @提到的system("pause")

其次,你應該在寫完數據之後尋求開始。

buffer->write(data, 32768); 
buffer->seek(0); 
+0

謝謝! 我當時放棄了。 2個月後,我找不到任何結果產生聲音的正確方法。 :) –

相關問題