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中设计具有弯曲边缘的视频视图?

如何在 Android Studio 中将一个 VideoView 放在另一个 VideoView 下方?

如何在 android 的 videoview 中播放 .mp4 视频?

如何通过 URL 的视频视图知道视频在 android VideoView 中启动的实时时间?

在 ScrollView 中填充时,Android VideoView 不扩展

从父级删除后保留的子视图控制器