41

私はAndroid 2.2用にプログラミングしており、 SoundPoolクラスを使用して複数のサウンドを同時に再生しようとしていますが、ランダムな時間にサウンドがスピーカーから出なくなります。

再生されたはずの各サウンドについて、これが logcat に出力されます。

AudioFlinger could not create track. status: -12 
Error creating AudioTrack
Audio track delete

例外はスローされず、ボリュームの不足を除いて、プログラムは変更なしで実行を続けます。エラーの原因となった条件を追跡したり、エラーが発生した後にエラーを再現したりするのに非常に苦労しました。ドキュメントのどこにもエラーが見つからず、ほとんど途方に暮れています。

どんな助けでも大歓迎です!

編集:oggではなくmp3ファイルをロードしていることを忘れていました。

4

9 に答える 9

22

最近ロードして再生しようとしていたいくつかのサウンドで、ほぼ同じ問題が発生しました。

このエラーの原因となっている単一の mp3 をロードするように分解しました。

私が注意したことの1つは、-1のループでロードすると、「ステータス12」エラーで失敗しますが、ループ0回にロードすると成功することです。1回ロードしようとしても失敗しました。

最終的な解決策は、オーディオ エディターで mp3 を開き、わずかに低い品質で再編集して、ファイルを小さくし、システム内のリソースをあまり消費しないようにすることでした。

最後に、使用しているオブジェクトでリリースを実行することを奨励するこの議論があります。使用できるリソースには実際にハード制限があり、それはシステム全体に及ぶため、リソースのいくつかを使用する場合は、他のアプリはそれらを使用できなくなります。

https://groups.google.com/forum/#!topic/android-platform/tyITQ09vV3s/discussion%5B1-25%5D

オーディオの場合、デバイスごとに 32 個のアクティブな AudioTrack オブジェクトというハード リミットがあり (アプリごとではありません。これらの 32 個をシステムの残りの部分と共有する必要があります)、AudioTrack は、SoundPool、ToneGenerator、MediaPlayer、OpenSL ES ベースのネイティブ オーディオの下で内部的に使用されます。など。ただし、実際の AudioTrack 制限は 32 未満です。メモリ、CPU 負荷などのソフト要素に大きく依存します。また、現在 Android オーディオ ミキサーのリミッターにはダイナミック レンジ圧縮がないため、多数のアクティブなサウンドがあり、それらが'はすべて騒々しいです。

ビデオ プレーヤーの場合、ビデオはデバイスに大きな負荷をかけるため、制限ははるかに低くなります。

これをメディア開発者に思い出させる機会として使用します。アプリが一時停止されているときは、メディア オブジェクトに対して release() を呼び出すことを忘れないでください。これにより、他のアプリが必要とする基盤となるリソースが解放されます。タイミングが予測できないため、メディア オブジェクトがガベージ コレクターによってファイナライズでクリーンアップされることに依存しないでください。

于 2012-08-19T06:47:39.037 に答える
3

Android ゲーム内の音楽トラッカーがノートをドロップし、Audioflinger エラーが発生するという同様の問題がありました (私のステータスは -22 でしたが)。しかし、私はそれを機能させたので、これは一部の人々を助けるかもしれません.

この問題は、1 つのサンプルが同時に複数回出力されたときに発生しました。つまり、私の場合は、2 つ以上のトラックで再生された単一のサンプルでした。これは時折デッドロックか何かのように見え、2 つのノートのうちの 1 つがドロップされました。解決策は、サンプルの 2 つのコピーを用意することでした (2 つの実際の ogg ファイル - 同一ですが、両方ともアセット内にあります)。次に、同じサンプルを再生していても、各トラックで別のファイルからのものでした。これで問題は完全に解決しました。

サンプルをメモリにキャッシュしているため、なぜ機能するのかわかりませんが、同じファイルを 2 つの異なるサウンドにロードしても問題は解決しませんでした。サンプルが 2 つの異なるファイルから出てきた場合にのみ、エラーがなくなりました。

これがすべての人に役立つわけではなく、最も美しい修正ではないと確信していますが、誰かを助けるかもしれません.

于 2013-01-28T00:32:00.083 に答える
2

john.k.doe は正しいです。mp3 ファイルのサイズを小さくする必要があります。ファイルあたりのサイズを 100kb 未満に保つ必要があります。通常の 128kbps の代わりに 32kbps のコンスタント ビット レート (CBR) を使用して、200kb のファイルを 72kb に縮小する必要がありました。それは私のために働いた!

于 2013-05-09T03:38:25.970 に答える
1

上記のように、ループには問題があります。repeat を -1 に設定すると、このエラーが発生しますが、0 ではすべてが正常に機能しています。サウンドを 1 つずつ再生しようとすると、一部のサウンドでこのエラーが発生することに気付きました。例えば:

mSoundPool.stop(mStreamID);
mStreamID = mSoundPool.play(mRandID, mVolume, mVolume, 1, -1, 1f);

このような場合、最初のトラックは問題なく再生されますが、サウンドを切り替えると、次のトラックでこのエラーが発生します。ループを使用すると、何らかの理由でバッファが過負荷になり、mSoundPool.stop がリソースをすぐに解放できないようです。

解決策:

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
   @Override
   public void run() {
      mStreamID = mSoundPool.play(mRandID, mVolume, mVolume, 1, -1, 1f);
}, 350);

それは機能していますが、遅延はデバイスによって異なります。

于 2015-07-01T15:50:32.613 に答える
1

試す

 final ToneGenerator tg = new ToneGenerator(AudioManager.STREAM_NOTIFICATION, 50);
 tg.startTone(ToneGenerator.TONE_PROP_BEEP, 200);
 tg.release();

解放すると、リソースが保持されます。

于 2012-12-27T03:53:47.703 に答える