web-dev-qa-db-ja.com

繰り返し再生後のMediaplayerエラー(-19,0)

レベルが完了するとサウンドが再生されるゲームがあります。最初はすべて正常に動作しますが、レベル10または20回を繰り返すと、logcatが突然「MediaPlayer error(-19,0)」および/または「MediaPlayer start called in state 0」と報告し、音が出なくなります。

私はもともとすべての音をmp3形式で持っていましたが、oggの方が信頼性が高いと読んだ後、それらをすべてoggに変換しましたが、エラーはまったく同じように見えました。

この問題を解決する方法はありますか?

43
Mick

私は同じ問題を抱えていましたが、次のコードを追加してプレーヤーをリリースすることで解決しました。

mp1 = MediaPlayer.create(sound.this, R.raw.pan1);
mp1.start();
mp1.setOnCompletionListener(new OnCompletionListener() {
    public void onCompletion(MediaPlayer mp) {
        mp.release();

    };
});
69
Gabriel Kaffka

サウンドを再生するために使用しているメディアプレイヤーを解放しない ..メディアプレイヤーを解放する必要があります次回再び割り当てます)。ですから、リソースを解放せずに何度もプレイすることはできません...

61
5hssba

MediaPlayerは、良いオプションではありません、ユーザーがすぐに複数のボタンをクリックして、MP同期的には発生しないそれらすべてのオブジェクト。これが、クリックごとに音が聞こえない理由です。 SoundPoolクラスを使用すると、小さなサウンドをメモリにロードしておくことができ、メディアプレーヤーで感じるようなラグなしで、いつでも好きなときに再生できます。 http://developer.Android.com/reference/Android/media/SoundPool.html これはニースのチュートリアルです: http://www.anddev.org/using_soundpool_instead_of_mediaplayer-t3115。 html

15
Akhil

再生する前に毎回MediaPlayerの新しいオブジェクトを作成し、その後リリースすることで、エラー(-19,0)と(-38,0)の両方を解決しました。

前 :

void play(int resourceID) {
    if (getActivity() != null) {

         //Using the same object - Problem persists
        player = MediaPlayer.create(getActivity(), resourceID);
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);

        player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                player.release();
            }
        });

        player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.start();
            }
        });

    }
}

後:

 void play(int resourceID) {

    if (getActivity() != null) {

        //Problem Solved
        //Creating new MediaPlayer object every time and releasing it after completion
        final MediaPlayer player = MediaPlayer.create(getActivity(), resourceID);
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);

        player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                player.release();
            }
        });

        player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.start();
            }
        });

    }
}
2

これは非常に古い質問ですが、これは私の検索結果で最初に出てきたので、同じ問題を抱えている他の人が最終的にこのページに来るでしょう。

他の人が言ったこととは異なり、実際には多くのメモリを使用することなく、小さな音にMediaPlayerを使用できます。サウンドボードアプリから少し修正したスニペットを挿入して、何が得られているかを示します。

private MediaPlayer mp;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_layout);

    mp = new MediaPlayer();

}

private void playSound(int soundID){
     mp.reset();
     AssetFileDescriptor sound = getResources().openRawResourceFd(soundID);
     try {
         mp.setDataSource(sound.getFileDescriptor(),sound.getStartOffset(),sound.getLength());
         mp.prepare();
     } catch (IOException e) {
         e.printStackTrace();
     }
     mp.start();


}

私が設定した方法で、MediaPlayerオブジェクトを作成し、サウンドを再生するたびに再利用するため、スペースを使いすぎないようにします。

.release()はオブジェクトを破棄する場合にのみ使用されるため、.release()の代わりに.reset()を呼び出しますが、MediaPlayerオブジェクトを保持する必要があります。

Assetfiledescriptorを使用して、mediaplayerのアドレスに新しいオブジェクトを設定するのではなく、mediaplayerに再生する新しいサウンドファイルを設定します。これにより、メソッド内で適切に処理されない新しいオブジェクトを作成し、最終的に同じものに遭遇するためですあなたが説明したようにエラー。

これは、MediaPlayerを使用する多くの方法の1つにすぎませんが、個人的には、小さなサウンドアプリケーションにのみ使用する場合に最も効率的だと思います。唯一の問題は、達成できるものが比較的制限されていることですが、実際に小さなサウンドアプリケーションに使用している場合、それは大きな問題にはなりません。

1
CarbonZonda

(-19,0)メディアプレーヤーのエラーを削除するために、エミュレーターの削除とエミュレーターの新規作成を試みます。

1
AnilPatel