0

私はkubuntu 12.10で作業しており、QIODeviceにサウンドを生成して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)));

audio->start(soundBuffer) への呼び出しもあります

— 別のスロットから QAudioOutput の初期化にエラーはありません

そして、まったく音がありません(他のすべてのアプリケーションには音があり、Qt4アプリをQt5に移植しています.Qt4では、Phononですべて問題ありません)

aboutToFinish スロットは、状態として ActiveState で最初に呼び出され、QAudioOutput::error を呼び出すときに NoError で呼び出されますが、予想される生成されたサウンドの長さよりもはるかに長く待っていても、それ以上は呼び出されません。

サウンド生成プロセスは問題ではなく、wav ファイルを書き込んでテストされており、動作します。

さらに、Qt のソースからマルチメディアの例を作成しました。純粋なオーディオに関しては出力がありません (たとえば、sprectrum の例)。一方、ビデオはサウンドで完全に再生されます。

それに関する既知の問題はありますか?それはバグですか?私は何か間違っていますか?

前もって感謝します ;)

4

2 に答える 2

3

8 ビットのサンプル サイズと符号付き整数形式を設定しているため、これは機能しません。

解決策: 8 ビットの解像度を得るには、サンプル タイプを符号なしに設定する必要があります。

format.setSampleType(QAudioFormat::UnsignedInt);

これは Qt のバグではありません。なんで?その答えは、WAV 仕様では、8 ビット サンプルは常に符号なしであるのに対し、16 ビット サンプルは常に符号付きであるということです。他の組み合わせは機能しません。

したがって、16 ビットのサンプルの場合は、次のようにする必要があります。

format.setSampleType(QAudioFormat:SignedInt);

(IMHO Qt が正しい形式を強制することによってこれらのケースを処理しないという事実は欠陥ですが、機能の欠如ではありません)。

詳細については、このページのメモ セクションをご覧ください: https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

また、この非常によく似た質問に対する解決策 (同じ問題ですが、16 ビットの場合): Qt QAudioOutput push mode

于 2014-01-04T06:29:40.417 に答える
1

追加してみてください:

QEventLoop loop;

loop.exec();

于 2016-03-28T21:54:25.653 に答える