【问题标题】:Android VideoView clear display after stopPlayback()Android VideoView 在 stopPlayback() 后清除显示
【发布时间】:2013-03-23 23:04:52
【问题描述】:

我正在使用 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;
  }
}

【问题讨论】:

    标签: android android-widget


    【解决方案1】:

    对我来说,有效的方法是使用setVisibility 隐藏然后显示VideoView

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

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

    【讨论】:

    • 我刚收到一位匿名用户的建议编辑,说将videoView.stopPlayback(); 作为代码的最后一行。我无法验证是否有必要,尽管视频需要已经停止才能让我的回答起作用。只是想把它留在这里以防它帮助任何人:)
    • @Willam 谢谢你的回答,我只解决一个问题。
    【解决方案2】:

    除非有人能提供更好的解决方案,否则我确定的解决方案是使用 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);
      }
    }
    

    我引用的可绘制对象是一个简单的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);
    

    【讨论】:

    • 当我这样做时,下一次播放仍然显示上一帧的最后一帧。关于为什么会发生这种情况的任何想法?
    • 实际视频帧绘制在 VideoView“下方”的表面上。在 VideoView 上设置背景将隐藏框架,但不会删除它。清除背景后,旧框架仍然存在。
    【解决方案3】:

    只需这段代码:

    videoView.setVideoURI(null);
    

    【讨论】:

    • 请在您的答案中添加更多详细信息!
    • java.lang.NullPointerException: uriString 当我 setUrl null 时,它会使我的应用程序崩溃。
    【解决方案4】:

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

    new Handler().postDelayed(new Runnable() {
    
         @Override
         public void run() {
            mVideoViewPlayList.setVisibility(View.GONE);
            mVideoViewPlayList.setVisibility(View.VISIBLE);
            mVideoViewPlayList.setVideoURI(Uri.parse(path));
        }
    }, 500);
    

    【讨论】:

    • 无意冒犯。我真的很想知道这些行的目的是什么。 mVideoViewPlayList.setVisibility(View.GONE); mVideoViewPlayList.setVisibility(View.VISIBLE);
    • @PsyCoder 在某些设备中,mVideoViewPlayList.setVideoURI(Uri.parse(path)) 直到可见性改变至少一次才会生效!
    • 感谢您的解释。有一天它可能会节省我的时间:)
    【解决方案5】:

    你可以这样做;

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

    希望对你有帮助

    【讨论】:

      【解决方案6】:

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

      MediaController mediaController = new MediaController (this); 
      videoView.setMediaController(mediaController);
      

      【讨论】:

      • 欢迎来到 SO。这真的足以“在 stopPlayback 之后清除 [the] 显示”吗?
      猜你喜欢
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      相关资源
      最近更新 更多