1

openSL で simpleBufferQueue を作成すると、バッファが次々に再生されるのはなぜですか? このシナリオはどのように役立ちますか? より実用的な使用法は、5 つ以上のバッファーで作成でき、バッファーをエンキューするとすぐにそれらを混合/同時に再生できる場合です。

現時点では、サウンドを一緒に再生する唯一の方法は、複数の単純なバッファー キュー AudioPlayer を作成することです。

openSL ドキュメントで何か間違ったことを読んでいる場合は、助けて修正してください。

4

2 に答える 2

3

OpenSL ES は、特に便利なオーディオ API になるように設計されています。高度なオーディオ ワークステーション アプリ、シンセサイザー アプリなどは、プログラマーによって多くのエフェクトと内部ミキシングが行われる可能性があります。特に設計とコードの移植性のために必要なのは、出力をどこかに置くことだけです。

OpenSL では、サウンドを同時に再生したい場合は、それらを自分でミックスし、ミックスされたサウンドでバッファーをロードする必要があります。これを行う最も簡単な方法は、サンプルごとに加算することです。各サウンドが最大のヘッドルームを達成できると仮定して、入力サウンドの数で割ります。(この分割により音量が少し低くなる可能性がありますが、クリッピングが許容されないと仮定すると、それを回避するには多少の努力が必要です。)

2 つのサウンドをミックスするには、出力のサンプル (つまり、エンキューされるデータ) を作成するときに、次のようにします。

out[i] = (snd1[i] + snd2[i])/2;

(計算を最適化し、データ型に注意し、別のインデックスを使用することもできます。)

一般に:

out[i] = (snd1[i] + ... + sndN[i])/N;
于 2013-10-07T17:23:56.247 に答える
1

複数のバッファ キューを作成するか、自分でオーディオをミックスする必要があります。サウンドプールのものを置き換えてopenslを使用するこのライブラリを確認できます:https://code.google.com/p/opensl-soundpool/

また、この質問はここでも回答されています: OpenSL ES Androidを使用して複数の効果音を同時に再生する

PS: 2 つのサウンドを手動でブレンドする場合、チャンネル数で割る (正規化する) ことは絶対にしないでください。. 飽和を避けるのは、プログラマーではなく、サウンド デザイナーの責任です。

于 2014-05-27T20:07:39.077 に答える