8

私の現在のコードは次のとおりです。

void Sound::run() {
    QFile audio_file(mResourcePath);
    if(audio_file.open(QIODevice::ReadOnly)) {
        audio_file.seek(44); // skip wav header
        QByteArray audio_data = audio_file.readAll();
        audio_file.close();

        QBuffer* audio_buffer = new QBuffer(&audio_data);
        qDebug() << audio_buffer->size();

        QAudioFormat format;

        format.setSampleSize(16);
        format.setSampleRate(44100);
        format.setChannelCount(2);
        format.setCodec("audio/pcm");
        format.setByteOrder(QAudioFormat::LittleEndian);
        format.setSampleType(QAudioFormat::UnSignedInt);

        QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
        if (!info.isFormatSupported(format)) {
            qWarning()<<"raw audio format not supported by backend, cannot play audio.";
            return;
        }
        qDebug() << info.deviceName();

        QAudioOutput* output = new QAudioOutput(info, format);
        output->start(audio_buffer);
    }
}

この全体は QThreadPool の QRunnable として開始され、その部分は正常に動作します。問題は、音声がまったく得られないことです。サウンド デバイスは動作しています。バッファはいっぱいです。何が悪いのかわからない。app.exec() を使用します。助けていただければ幸いです。

4

1 に答える 1

6
  1. デバイス ( QBuffer) が開いている必要があります:

    QBuffer audio_buffer(&audio_data);        
    audio_buffer.open(QIODevice::ReadOnly);
    
  2. QAudioOutput何かを再生するにはイベントループが必要であり、そのループはそれが属するスレッドで実行されている必要があります。明示的に別のスレッドに移動しない場合に作成されたスレッドは次のとおりです。

    // Create the device and start playing...
    QAudioOutput output(info, format);
    output.start(&audio_buffer);     
    
    // ...then wait for the sound to finish 
    QEventLoop loop;
    QObject::connect(&output, SIGNAL(stateChanged(QAudio::State)), &loop, SLOT(quit()));
    do {
        loop.exec();            
    } while(output.state() == QAudio::ActiveState);        
    
  3. 割り当てたものはすべて、サウンドの再生が終了したときに割り当てを解除する必要があります。そうしないと、メモリ リークが発生し、イベント ループが関数内で実行されるようになるため、すべてをローカルに割り当てることができます。

于 2012-04-06T22:36:54.137 に答える