0

20種類の音のうち1つを毎秒ランダムに再生するアプリがあります。ほぼ1000回成功すると、メディアプレーヤーの作成関数は常にnullを返し始めます。アプリを終了して再起動しても問題は解決しません。唯一の解決策は、アプリを再度インストールするか、デバイスの電源をオフにしてからオンにすることです。

この状態から回復する方法はありますか?リリースまたはリセットすると、メディアプレーヤーはすでにnullになっており、例外が発生します。

私が毎秒行うシーケンスは次のとおりです。

if (mp != null)
{   
    if (mp.isPlaying()) 
    {
       mp.stop();   
    }   
    if (mp != null) mp.release();   
    if (mp != null) mp = null;  
}   

mp = MediaPlayer.create(this, R.raw.sound);

if (mp !=null)
{
   mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() 
   {           
      public void onPrepared(MediaPlayer mp) 
      {
    if (mp != null) mp.start();
      }
   };
 }
 else
 {
    // error, what should I do here to recover from this situation?
 }
4

2 に答える 2

0

あなたの問題は、あなたがリリースしているときでさえ、あなたがMediaPlayerそれを再び使おうとする時までに、特に毎秒20回、OSがまだリソースを手放していないかもしれないということです。実際には、SoundPoolこのようなものの代わりに使用することを検討することをお勧めします。

とにかく、これをで行うには、参照を1つMediaPlayerだけ保持し、そのオブジェクトを毎回異なるサウンドに再利用する必要があります。再生にrawリソースを使用しているため、通常の再利用シナリオは次のようになります。

AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.sound);

//Resets the MediaPlayer state but keeps the resources
mp.reset();

//Sets the data source to the requested sound (R.raw.sound)
mp.setDataSource(afd.getFileDescriptor());

//Prepare the MediaPlayer to play and then start
mp.prepare();
mp.start();
于 2012-10-02T21:07:45.400 に答える
0

私は解決策を見つけたようです。エラーを再現せずに、10000を超えるオーディオを再生しました。

彼の助けをくれたkcoppockに感謝したい。彼が説明したようにデータソースを変更する方がはるかに良いので、今は作成してリリースしない。しかし、それは主な問題ではなかった。

最終的な解決策は、すべてのmp3ファイルをoggファイルに変換することでした!!!!

メディアプレーヤーは間違いなくmp3ファイルに問題があります。

于 2012-10-04T20:05:22.157 に答える