3

私は現在、OpenSL を介して Android で効果音のミキシングを実装しています。初期実装を行っていますが、いくつかの問題が発生しました。

私の実装は次のとおりです。

1) サウンド エフェクトごとに、OGG ファイルを参照する SLDataLocator_AndroidFD データ ソースを使用する複数の AudioPlayer オブジェクト (同時サウンドごとに 1 つ) を作成します。たとえば、立て続けに再生される銃の発砲音 (gun.ogg と呼びましょう) がある場合、同じ gun.ogg オーディオ ソースと同じ outputmix オブジェクトを参照するおよそ 5 つの AudioPlayer オブジェクトを使用します。

2) そのサウンド エフェクトを再生する必要がある場合、作成したすべての AudioPlayer オブジェクトを検索し、現在 SL_PLAYSTATE_PLAYING 状態にないオブジェクトを見つけて、それを使用してエフェクトを再生します。

3) クリップを再生する前に、SLPlayItf::SetPosition を使用してクリップの開始位置をシークします。

これまでのところ問題なく動作していますが、サウンドを立て続けに再生するとパチパチというノイズが発生します。Android NDK ニュースグループで、Android 上の OpenSL にはデータ ソースの切り替えに関する問題があることを読みました。誰かがこの問題に遭遇しましたか?

また、Android での OpenSL のサウンド ミキシング アプローチを見た、または思いついた人が他にいるかどうかも疑問に思っています。もしそうなら、あなたのアプローチは私のものとは異なりますか? パチパチ音について何かアドバイスはありますか?

インターネットで OpenSL のドキュメントとサンプル コードを探しましたが、ミキシングに関してはあまり情報がありません (既にわかっている読み込みのみ)。どんな助けでも大歓迎です。

4

1 に答える 1

1

これはおそらく最善の方法ではありません (オーディオ プレーヤーのインスタンスを多数作成する)。残念ながら、OpenSL ES の Android バージョン (2.3) は SLDynamicSourceItf をサポートしていません。これは、OpenAL のソース バインディング インターフェイスに似ています。1 つのアプローチは、複数のストリーム プレーヤーを作成することです。次に、現在再生されていないストリーム プレーヤーを検索し、メモリからサウンド エフェクトのストリーミングを開始します。理想的ではありませんが、実行可能です。

効果音にも ogg 形式を使用しないでください。デコードする必要がないため、WAV (PCM) の方が適しています。

Ogg はバックグラウンド ミュージックのストリーミングに適しています。

于 2012-02-08T01:41:08.027 に答える