MediaPlayer onCompletion未被准确调用

时间:2013-06-21 06:35:27

标签: android android-mediaplayer wav

在我的应用程序中,我使用MediaPlayer API创建了一个音频播放器(仅限WAV文件)。 但是玩家每次都不会给onCompletion Listener回调。有时它会给出回调但不是每次都回调。我正在对wav文件进行一些音频处理,比如插入和覆盖。

是因为音频标题中缺少任何内容吗? 回放完成后为什么不回调?

7 个答案:

答案 0 :(得分:5)

确保正确设置了文件头。如果标题中的某些内容丢失callback onCompletion可能不会发生。

如果媒体播放器正在播放.wav文件,搜索可能会正确发生,但会出现混乱。因此,当回放完成时,文件的总持续时间和onCompletion之间的差异将分别为0-1000毫秒。因此,如果出现这种情况,你应该猜测为onColmpletion并做你想做的事情。这有点难以获得onCompletion

我在使用媒体播放器播放.wav文件时遇到了同样的问题。这不是解决这个问题的好方法,但是当我遇到同样的情况时,我解决了同样的问题。希望这在某些方面对你有所帮助。

答案 1 :(得分:1)

看来你必须在调用start()之后调用setOnCompletionListener。 看看这里:https://stackoverflow.com/a/19555480/1860130

为我工作。

答案 2 :(得分:0)

您正在使用正确的方法但是您已经传递了任何代码 “//在播放完成时执行一些任务”区域

如果没有,那么回调就没有任何意义。

mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {

   public void onCompletion(MediaPlayer mp) {

        Toast.makeText(getApplicationContext(),"Playback Completes", Toast.LENGTH_SHORT).show();
    }
});

此方法将在播放完成时弹出Toast。

答案 3 :(得分:0)

为了获得调用的onCompletion()函数,你应该通过调用mediaPlayer.setLooping(false)来禁用循环;

答案 4 :(得分:0)

确保MediaPlayer不是本地(时间)变量。由于GC将收集局部变量。在这种情况下,onCompletion将无法被调用。

答案 5 :(得分:0)

true 返回给MediaPlayer上的OnErrorListner方法

@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
    //Invoked when there has been an error during an asynchronous operation
    switch (what) {
        case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:
            Log.e("MediaPlayer Error", "MEDIA ERROR NOT VALID FOR PROGRESSIVE PLAYBACK " + extra);
            break;
        case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
            Log.e("MediaPlayer Error", "MEDIA ERROR SERVER DIED " + extra);
            break;
        case MediaPlayer.MEDIA_ERROR_UNKNOWN:
            Log.e("MediaPlayer Error", "MEDIA ERROR UNKNOWN " + extra);
            break;
    }
    return true;
}

答案 6 :(得分:-2)

完成录制后,尝试使用睡眠方法。 也用;发生地点之前的.prepare(),以避免崩溃。