5

そこで、オーディオ データを OpenAL にストリーミングするスレッド化された IMA ADPCM デコーダを構築しています (簡単な説明については以下を参照)が、いくつかの問題に遭遇しました。

私の問題の 1 つは、alBufferData への呼び出しが時々あることです。

alBufferData(*bufferID, format, pcmData, sizeInBytes, bitRate);

AL_INVALID_VALUEただし、パラメーターをチェックすると、たとえば次のようになります。

bufferID='109770616', format='AL_FORMAT_STEREO16', dataPtr='109754188', sizeInBytes='8164'

手がかりはありますか?これが発生すると、再生されている実際のサウンドが途切れ途切れになり、エラーは通常、(同じサウンドで) 連続して ~ 10 回発生します。また、通常、同じ音を繰り返し開始したときにも発生します (たとえば、LMG で短いバーストを撃ったときなど... ;))

streaming-decoder-module-thing のクイック ツアー

サウンドの再生方法:

  1. サウンドがトリガーされて再生されます。
  2. 1 bufferSize 相当のオーディオがデコードされ、残りはさらにデコードするためにキューに入れられます。
  3. OpenAL がトリガーされ、サウンドの再生が開始されます。

デコード/ストリーミング ループ

  1. デコードのためにキューに入れられたサウンドごとに、bufferSize 相当のオーディオをデコードします。
  2. デコードされたオーディオは、適切な bufferID を使用して alBuffer (上記の呼び出しを参照) に追加されます。
4

2 に答える 2

3

手遅れでない場合は、BufferData で発生した同様の問題について説明します。これを修正した方法を次に示します。ただし、スレッド化されたプログラムの詳細はわかりません。

無効な値が返される理由はいくつかありますが、私が知っている理由は次のとおりです
。 . その場合は、ソース プロパティの ID を削除します。
・プレイ中のバッファフォーマットの変更。ソースの再生が開始されると、バッファ データ自体を除いて、バッファ設定 (fmt、samplerate) を変更することはできません。それがキューに入れられた別のソースであっても同様です。

これらの設定のいずれかを別のスレッドで変更しているようです。

ポップの原因となるもう 1 つのことは、サウンドの再生です。play をもう一度呼び出すと、ソースがコールドに停止し、現在のバッファが巻き戻されて最初から再生が開始されます。そのような銃の音を鳴らすことは、あなたが望むようには聞こえません(レイヤー化されていると思います)。2 つのオプション、残りの銃の音をバッファに混ぜてから再生しますが、これはうまくいかないかもしれません。もう 1 つの簡単な証拠は、複数のソースを使用し、発砲ごとに呼び出されるソースをローテーションすることです。

あなたのプロジェクトで頑張ってください。

于 2012-07-10T21:09:21.667 に答える
1

同じエラーに出くわし、この質問が検索エンジンで最初に表示されるので、他の人に役立つことを願って、私が遭遇した問題をすぐに投稿したいと思います. OpenAL でstb_vorbis ( https://github.com/nothings/stbから) を使用し、データを OpenAL にフィードしようとすると、同じ AL_INVALID_VALUE エラーが発生しました。バッファーは 4 の倍数でなければならないことが判明しました (少なくとも soft_al 実装と AL_FORMAT_STEREO16 では (他の実装/フォーマットでは異なる場合があります)。

bufferSize = stb_vorbis_decode_filename("sound.ogg", &channels, &sampleFrequency, &pcmData);

// Adjust the bufferSize to a multiple of 4
bufferSize = bufferSize - bufferSize%4;

alBufferData(mySoundBuffer, AL_FORMAT_STEREO16, pcmData, bufferSize, sampleFrequency);

試行錯誤で動作するようになったので、このエラーが発生した場合は、これも確認してください。

よろしく、 モリッツ

于 2020-06-03T11:48:13.973 に答える