【问题标题】:MediaPlayer onCompletion is not being called accuratelyMediaPlayer onCompletion 没有被准确调用
【发布时间】:2017-10-05 19:30:22
【问题描述】:

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

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

【问题讨论】:

标签: android android-mediaplayer wav


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    为我工作。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          您使用了正确的方法,但您是否在 "//播放完成后在这里做一些任务" AREA.

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

          mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {
          
             public void onCompletion(MediaPlayer mp) {
          
                  Toast.makeText(getApplicationContext(),"Playback Completes", Toast.LENGTH_SHORT).show();
              }
          });
          

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

          【讨论】:

            【解决方案6】:

            返回 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;
            }
            

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-04-15
                • 1970-01-01
                • 1970-01-01
                • 2017-07-25
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多