Android VideoView:视频在从父视图中删除后变黑

时间:2012-06-04 14:17:31

标签: android video-streaming fullscreen android-videoview

我目前正在使用VideoView播放rtsp直播源。这很好用。

VideoView最初位于包含其他元素的片段中,处于“正常”状态,我正在尝试实现全屏切换按钮。

要进入全屏模式,我将从其父级(LinearLayout)中删除VideoView,然后将其添加到另一个LinearLayout,使用getActivity()添加到其他所有内容.addContentView(),这里是代码:< / p>

    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兼容

2 个答案:

答案 0 :(得分:1)

你的问题是你正在使用的VideoView是黑色的,并暂时在切换视图之间徘徊?

如果是这样的话,我一直试图找出这个问题的原因,现在已经过了一周。我无法弄清楚实际原因,但我的解决方法确实阻止了VideoView在屏幕更改中持续存在:

public void hideVideoView(){        
    runOnUiThread(new Runnable() {
        public void run() {
            findViewById(R.id.yourVideoView).setVisibility(View.INVISIBLE);
        }
    });    
}

我基本上只是在视图切换时将视图设置为不可见,如果重新加载视图,我只需将其设置回View.Visible

答案 1 :(得分:0)

这可能不会:)解决你的问题,但你可以在删除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;