Android VideoView:从父视图中删除视频后变黑
Posted
技术标签:
【中文标题】Android VideoView:从父视图中删除视频后变黑【英文标题】:Android VideoView: video goes black after being removed from parent view 【发布时间】:2012-06-04 14:17:31 【问题描述】:我目前正在使用 VideoView 播放 rtsp 实时流媒体源。这工作正常。
VideoView 最初位于带有其他元素的片段内,处于“正常”状态,我正在尝试实现全屏切换按钮。
要进入全屏模式,我将 VideoView 从其父级(LinearLayout)中删除,然后将其添加到另一个 LinearLayout,使用 getActivity().addContentView() 添加到其他所有内容之上,代码如下:
LayoutInflater lf = getActivity().getLayoutInflater();
vFullScreen = lf.inflate(R.layout.full_screen, myViewGroup, false);
LinearLayout fullscreenCont = (LinearLayout) vFullScreen.findViewById(R.id.fullscreen_container);
((ViewGroup) vsPlayer.getParent()).removeView(vsPlayer);
fullscreenCont.addView(vsPlayer);
LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
getActivity().addContentView(vFullScreen, params);
问题是视频一旦从原始父视图中删除就会变黑。
我想要实现的是保留视频实例以避免再次重新连接/缓冲,但我不知道如何在父母切换期间保留视频播放,有什么想法吗?
编辑:
如果我暂停 videoView 然后恢复它,如下所示:
LayoutInflater lf = getActivity().getLayoutInflater();
vFullScreen = lf.inflate(R.layout.full_screen, myViewGroup, false);
LinearLayout fullscreenCont = (LinearLayout) vFullScreen.findViewById(R.id.fullscreen_container);
vsPlayer.getVideoView().suspend();
((ViewGroup) vsPlayer.getParent()).removeView(vsPlayer);
fullscreenCont.addView(vsPlayer);
LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
getActivity().addContentView(vFullScreen, params);
vsPlayer.getVideoView().resume();
视频播放被中断(显眼的几秒钟变黑),但随后又恢复了,这好多了,但并不完美,因为恢复播放需要很长时间。
另一个不太好的部分是,VideoView 类的 suspend() 和 resume() 方法在 API 级别 8 及以上可用,我需要与 API 级别 7 兼容
【问题讨论】:
您找到解决方案了吗?我也有同样的问题。 【参考方案1】:您正在使用的 VideoView 是否变黑并在视图切换之间暂时徘徊?
如果是这样,我已经花了整整一周时间试图找出导致该问题的原因。我无法找出真正的原因,但我的解决方法确实阻止了 VideoView 通过屏幕更改持续存在:
public void hideVideoView()
runOnUiThread(new Runnable()
public void run()
findViewById(R.id.yourVideoView).setVisibility(View.INVISIBLE);
);
我基本上只是在视图切换时将视图设置为不可见,如果重新加载视图,我只需将其设置回 View.Visible
【讨论】:
除非我在 VideoView 上调用 suspend() 之前将其从其父视图中删除,然后在将其添加到新的父视图后调用 resume,否则视频会变黑并且永远不会恢复。通过这些调用,视频在明显暂停后恢复,根据日志,MediaPlayer 似乎已完全释放并重新启动,这一定是恢复/从黑色恢复需要这么长时间的原因 我还是黑屏。我在这里问过类似的问题***.com/questions/24903232/…【参考方案2】:这可能不会:) 解决您的问题,但您可以在删除 VideoView 之前找到您所在的位置:
long progress = vsPlayer.getCurrentPosition();
LayoutInflater lf = getActivity().getLayoutInflater();
vFullScreen = lf.inflate(R.layout.full_screen, myViewGroup, false);
LinearLayout fullscreenCont = (LinearLayout) vFullScreen.findViewById(R.id.fullscreen_container);
((ViewGroup) vsPlayer.getParent()).removeView(vsPlayer);
fullscreenCont.addView(vsPlayer);
LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
getActivity().addContentView(vFullScreen, params);
vsPlayer.seekTo(progress);
实际上我前段时间遇到了同样的问题。我最终所做的是将 VideoView 的 layoutparams 更改为 match_parent 而不是删除它。
mVideoView.getLayoutParams().width = LayoutParams.MATCH_PARENT;
mVideoView.getLayoutParams().height = LayoutParams.MATCH_PARENT;
【讨论】:
感谢您的回复!不需要找,因为我在直播,没有问题。对于第二部分,我理解你的建议,我会尝试这样做,问题是我的视频视图在一个片段内,它本身就在一个选项卡内,所以我不知道我是否可以让它“成长”全屏从它所在的位置来看,它肯定需要比它的父级更大,所以 LayoutParams.MATCH_PARENT 在这种情况下不会成功......将尝试找到一些替代方案以上是关于Android VideoView:从父视图中删除视频后变黑的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Android Studio 中将一个 VideoView 放在另一个 VideoView 下方?
如何在 android 的 videoview 中播放 .mp4 视频?
如何通过 URL 的视频视图知道视频在 android VideoView 中启动的实时时间?