8

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

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

4

7 回答 7

5

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

如果 mediaplayer 正在播放.wav文件,搜索可能会正确发生,但会出现抽搐。onCompletion因此,当播放完成时,文件的总时长和分别会有 0-1000 毫秒的差异。因此,如果出现这种情况,您应该将其猜测为 onColmpletion 并做您想做的事情。那是一个有点棘手的方法来获得onCompletion.

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

于 2013-07-01T05:38:29.660 回答
3

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

为我工作。

于 2017-02-01T22:30:44.563 回答
1

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

于 2017-07-13T18:51:43.840 回答
1

为了调用 onCompletion() 函数,您应该通过调用 mediaPlayer.setLooping(false); 禁用循环;

于 2017-03-24T14:17:25.917 回答
0

您使用了正确的方法,但您是否在 “// 播放完成时在此处执行一些任务”中传递了任何代码 AREA

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

mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {

   public void onCompletion(MediaPlayer mp) {

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

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

于 2013-06-21T07:20:04.867 回答
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;
}
于 2017-10-05T11:30:22.330 回答
-2

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

于 2013-06-29T16:04:12.453 回答