1

我有一个 TextureView。我可以从我的 TextureView 中的评估文件夹中播放视频。现在我想检查视频是否完成。我写了 setOnCompletionListener 但没有工作。这是我的来源

 private void playVideoAnimation()
{
    textureView.setVisibility(View.VISIBLE);
    mMediaPlayer = new MediaPlayer();

    textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
        @Override
        public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i2) {
            Surface surface = new Surface(surfaceTexture);

            try {
                Log.e("FILE_NAME",FILE_NAME);
                AssetFileDescriptor afd = getAssets().openFd(FILE_NAME);

                mMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                mMediaPlayer.setSurface(surface);
                mMediaPlayer.setLooping(true);
                mMediaPlayer.prepareAsync();
                mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mediaPlayer) {
                        mediaPlayer.start();
                    }
                });

                mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

                    @Override
                    public void onCompletion(MediaPlayer mp) {

                        Log.e("FILE_NAME", "Finished");
                    }

                });



            } catch (IllegalArgumentException e) {
                Log.d(TAG, e.getMessage());
            } catch (SecurityException e) {
                Log.d(TAG, e.getMessage());
            } catch (IllegalStateException e) {
                Log.d(TAG, e.getMessage());
            } catch (IOException e) {
                Log.d(TAG, e.getMessage());
            }
        }

        @Override
        public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {

        }

        @Override
        public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {

            return false;
        }

        @Override
        public void onSurfaceTextureUpdated(SurfaceTexture surface) {

        }
    });
}

我还在 setSurfaceTextureListener 之外编写了 setOnCompletionListener 侦听器,但也无法正常工作。我怎样才能解决我的问题?如果有人知道解决方案,请帮助我

4

1 回答 1

1

最有可能的OnCompletionListener是,由于以下行,您永远不会被调用:

mMediaPlayer.setLooping(true);

根据MediaPlayer 文档

当播放到达流的末尾时,播放完成。

  • 如果循环模式设置为truewith setLooping(boolean),则 MediaPlayer 对象应保持在 Started 状态。
  • 如果循环模式设置为false,则播放器引擎调用用户提供的回调方法OnCompletion.onCompletion(),如果 aOnCompletionListener事先通过 注册setOnCompletionListener(OnCompletionListener)。回调的调用表明对象现在处于 PlaybackCompleted 状态。
  • 在 PlaybackCompleted 状态下,调用start()可以从音频/视频源的开头重新开始播放。

如果您想在MediaPlayer完成播放循环播放时获得回调,您可以更改您的实现以遵循第三个要点中给出的建议:删除mMediaPlayer.setLooping(true)并在您的OnCompletionListener调用mp.start()中从头开始重新开始播放。

于 2015-10-30T10:57:02.533 回答