【问题标题】:android check if mediaplayer finished in TextureViewandroid检查媒体播放器是否在TextureView中完成
【发布时间】:2015-10-30 18:57:02
【问题描述】:

我有一个 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 侦听器,但也无法正常工作。 我怎样才能解决我的问题?如果有人知道解决方案,请帮助我

【问题讨论】:

    标签: android android-mediaplayer android-textureview


    【解决方案1】:

    很可能,您的OnCompletionListener 永远不会因为以下行而被调用:

    mMediaPlayer.setLooping(true);
    

    根据MediaPlayer documentation

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多