MediaPlayer的onCompletion方法没有被精确地调用

8
在我的应用程序中,我使用 MediaPlayer API 创建了一个音频播放器(仅支持WAV文件)。但有时候它不会回调 onCompletion Listener。我正在对 WAV 文件进行一些音频处理,比如插入和覆盖。这是因为音频头缺失导致的吗?为什么在播放完成后它不会回调呢?

如果应用程序处于睡眠状态,请尝试以下方法:https://dev59.com/qFPTa4cB1Zd3GeqPmMSb#60911323 - SJX
7个回答

6
确保文件头设置正确。如果头中的某些内容缺少回调到onCompletion,可能不会发生回调。
如果mediaplayer正在播放.wav文件,寻找可能会发生正确,但会出现抖动。因此,当播放完成时,文件的总持续时间和onCompletion之间将存在0-1000毫秒的差异。因此,如果出现这种情况,您应该将其视为onCompletion并执行您想要的操作。这是一种有点棘手的方式来获得onCompletion。
我在使用mediaplayer播放.wav文件时遇到了相同的问题。这不是解决此问题的好方法,但当我遇到相同的情况时,我用同样的方式解决了相同的问题。希望这也能在某种程度上帮助您。

3

2

确保 MediaPlayer 不是一个本地(临时)变量。因为局部变量将被 GC 收集。在这种情况下,onCompletion 将没有机会被调用。


2
为了使 onCompletion() 函数被调用,您需要使用 mediaPlayer.setLooping(false); 去禁用循环播放。

0

在MediaPlayer的OnErrorListner方法中返回true

@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;
}

0

你使用了正确的方法,但是你是否在"// do some tasks here when playback completes " AREA中传递了任何代码。

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

mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {

   public void onCompletion(MediaPlayer mp) {

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

这个方法将在播放完成时弹出一个Toast。


-3
尝试在录制完成后使用睡眠方法。同时,在播放之前使用.prepare()以避免崩溃。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接