27

我正在使用 VideoView 组件来播放视频。手动调用 stopPlayback() 后,我似乎无法清除 VideoView 显示。我想重置 VideoView 以便原始背景可见。

  1. 在 VideoView 组件中播放视频。
  2. 选择要播放的新视频。
  3. VideoView 卡在第一个视频的最后一帧,直到下一个视频开始。如果下一个视频出现错误,则第一个视频中的静态图像仍然卡在那里。
  4. 如果我让视频播放到完成状态,则显示被清除。

我正在使用的代码:

private VideoView videoViewer = null;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
  if (videoViewer != null) {
    videoViewer.setOnPreparedListener(new OnPreparedListener());
  }
...
}

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  if (videoViewer != null) {
    videoViewer.stopPlayback();
    videoViewer.setVideoURI(Uri.parse("http://my_vido_url/playlist.m3u8"));
  }
}

private class OnPreparedListener implements MediaPlayer.OnPreparedListener {
  @Override
  public void onPrepared(MediaPlayer mp) {
    videoViewer.start();
  }
}

请注意,基于 VideoView.java 源,stopPlayback() 对底层 MediaPlayer 执行以下操作:

public void stopPlayback() {
  if (mMediaPlayer != null) {
    mMediaPlayer.stop();
    mMediaPlayer.release();
    mMediaPlayer = null;
  }
}
4

6 回答 6

18

对我来说,有效的只是隐藏然后显示VideoViewusing setVisibility

public void clearCurrentFrame() {
    videoView.setVisibility(GONE);
    videoView.setVisibility(VISIBLE);
}

这是因为我想让它VideoView变得透明,而不是纯色。将背景设置为透明不起作用 - 视频帧仍然显示。

于 2015-02-12T19:00:48.917 回答
13

除非有人可以提供更好的解决方案,否则我确定的解决方案是使用setBackgroundResource,它的名称似乎很奇怪,因为它似乎改变了前台资源。

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
  videoViewer.setBackgroundResource(R.drawable.viewer_background);
...
}

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  if (videoViewer != null) {
    videoViewer.stopPlayback();
    // Set the background back to the drawable resource to clear the current video when switching to a new one.
    videoViewer.setBackgroundResource(R.drawable.viewer_background);
    videoViewer.setVideoURI(Uri.parse("http://my_vido_url/playlist.m3u8"));
  }
}

private class OnPreparedListener implements MediaPlayer.OnPreparedListener {
  @Override
  public void onPrepared(MediaPlayer mp) {
    videoViewer.start();
    // Clear the background resource when the video is prepared to play.
    videoViewer.setBackgroundResource(0);
  }
}

我引用的 drawable 是一个简单layer-list的带有自定义蓝色背景和居中徽标图像的对象。

可绘制\viewer_background.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
  <item>
    <shape android:shape="rectangle">
      <solid android:color="@color/custom_blue" />
    </shape>
  </item>
  <item>
    <bitmap android:src="@drawable/img_logo"
      android:gravity="center" />
  </item>
</layer-list>

或者,我也可以用来setZOrderOnTop控制表面视图的放置位置(您还可以在 VideoViewer 顶部定义另一个视图并以这种方式切换可见性):

videoViewer.setZOrderOnTop(false);
videoViewer.setZOrderOnTop(true);

或者,我也可以setBackgoundColor用来完成与以下相同的事情setBackgroundResource

videoViewer.setBackgroundColor(getResources().getColor(R.color.custom_blue));
videoViewer.setBackgroundColor(Color.TRANSPARENT);
于 2013-04-03T12:28:37.383 回答
2

只是这段代码:

videoView.setVideoURI(null);
于 2016-01-28T08:02:46.167 回答
1

好吧,对我来说,这个线程中的任何解决方案都不起作用,所以我尝试了其他方法,下面是对我有用的解决方案,

new Handler().postDelayed(new Runnable() {

     @Override
     public void run() {
        mVideoViewPlayList.setVisibility(View.GONE);
        mVideoViewPlayList.setVisibility(View.VISIBLE);
        mVideoViewPlayList.setVideoURI(Uri.parse(path));
    }
}, 500);
于 2015-05-15T06:41:32.140 回答
1

你可以这样做;

videoView.stopPlayBack();   
 videoView.seekTo(0);  

希望对你有帮助

于 2018-11-29T05:45:35.850 回答
0

媒体控制器类本身已经具有此功能,使用下面这个简单的代码,您可以创建所有必要的交互。

MediaController mediaController = new MediaController (this); 
videoView.setMediaController(mediaController);
于 2019-05-16T15:40:19.007 回答