在videoView android中收到错误后循环缓冲视频

时间:2015-09-17 07:47:09

标签: android video-streaming android-videoview

我想在VideoView

中收到错误后重复缓存的视频

我使用以下代码播放视频:

  public void playVideo() {


        if (!isAdded()) {
            return;
        }

        try {

            // Get the URL from String VideoURL
            Uri video = Uri.parse("http://www.sample-videos.com/video/mp4/480/big_buck_bunny_480p_20mb.mp4");
            videoView.setMediaController(new MediaController(
                    getActivity()));
            videoView.setVideoURI(video);


        } catch (Exception e) {
            ApplicationClass.gLogger.out("Error Happened in initializing ");
            e.printStackTrace();
        }


        videoView.requestFocus();
        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            // Close the progress bar and play the video
            public void onPrepared(MediaPlayer mp) {
                videoView.start();
                mp.setLooping(true);

            }
        });

        videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {

                //playVideo again;
                if (i == MediaPlayer.MEDIA_ERROR_SERVER_DIED || i == MediaPlayer.MEDIA_ERROR_IO || i == MediaPlayer.MEDIA_ERROR_UNKNOWN) {
                    mediaPlayer.reset();

                }
                return true;
            }
        });

    }

每件事都没问题,但是当我丢失连接时,我的视频没有循环播放。

在使用MediaPlayer.MEDIA_ERROR_IO调用的错误侦听器上。我想循环播放我的缓冲视频。

我在onError侦听器中尝试了什么?

再次调用playVideo()方法。

使用mediaPlayer.seekTo()mediaPlayer.start()

使用videoView.seekTo()

我搜索了很多东西,看到很多链接,但没有为我工作。

因为我们无法从VideoView获取缓冲区数据,所以我无法将缓冲区数据保存到文件中并从中读取。

提前致谢

//更新

寻求不在videoView中工作,因为在VideoView提到的源代码中,当我们调用seek方法时,调用以下方法:

private boolean isInPlaybackState() {
        return (mMediaPlayer != null &&
                mCurrentState != STATE_ERROR &&
                mCurrentState != STATE_IDLE &&
                mCurrentState != STATE_PREPARING);
    }

因为mCurrentState STATE_ERROR不再寻求工作,但我无法弄清楚如何解决我的问题。

1 个答案:

答案 0 :(得分:1)

也许它会有所帮助:

    textureView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
            //it,s be called without isInPlaybackState()
            mp.seekTo(second);
            return false;
        }
    });

建议如何绕过调用isInPlaybackState()