一个视频视图被另一个视频视图阻止

Posted

技术标签:

【中文标题】一个视频视图被另一个视频视图阻止【英文标题】:One videoview blocked by another videoview 【发布时间】:2011-08-06 14:42:21 【问题描述】:

我的活动布局如下所示。基本上我在左侧有一个列表视图菜单和两个视频视图,我根据用户单击的菜单项在它们之间切换。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout   
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_system_status"
    android:title="@string/system_status"
    android:layout_
    android:layout_
    android:orientation="horizontal">

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical"
        android:layout_weight="4">
        <ListView
        android:id="@+id/list_video_feed"
        android:layout_
        android:layout_>
        </ListView>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linear_layout_live_video"
        android:layout_
        android:layout_
        android:orientation="vertical"
        android:layout_weight="1">

        <VideoView 
        android:id="@+id/video_view" 
        android:layout_
        android:layout_
        android:layout_gravity="center"
        />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linear_layout_video_gallery"
        android:layout_
        android:layout_
        android:orientation="vertical"
        android:layout_weight="1">

        <Gallery 
        android:id="@+id/gallery"
        android:layout_
        android:layout_
        />

        <VideoView 
        android:id="@+id/archived_video_view" 
        android:layout_
        android:layout_
        />

    </LinearLayout>

</LinearLayout>

在我的代码中,如果我想从没有画廊的视图中播放视频,我会隐藏另一个。

linearLayoutVideoGallery.setVisibility(GONE);
linearLayoutLiveVideo.setVisibility(VISIBLE);
playVideo();

问题是archived_video_view 保持在顶部,只有画廊隐藏。有小费吗?如果您需要任何其他信息,请告诉我。谢谢!

编辑:这是我在 onCreate() 中选择菜单项的 if 语句。希望这会有所帮助。当我点击 position==1 然后 postion==2 时,画廊消失了,但archived_video_view 仍然在那里暂停,所以我只能看到画廊曾经所在的video_view 的顶部。

          lv.setOnItemClickListener(new OnItemClickListener() 
            public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) 
                if (position==1)  //video gallery list item has been pressed
                    vvLive.stopPlayback();
                    linearLayoutLiveVideo.setVisibility(GONE);
                    linearLayoutVideoGallery.setVisibility(VISIBLE);
                    playArchivedVideo();

                

                else if (position == 2)  //live video list item has been pressed
                    vvArchive.stopPlayback();
                    linearLayoutVideoGallery.setVisibility(GONE);
                    linearLayoutLiveVideo.setVisibility(VISIBLE);
                    playLiveVideo();
                
            
          );

【问题讨论】:

您确定您使用正确的 id 来获取您的 linearLayoutVideoGallery 和 linearLayoutLiveVideo 视图吗? 是的。当我单击视频库然后单击实时视频时,顶部的水平画廊被隐藏,我只看到实时视频播放的那一小部分,因为存档的视频仍在前景中。我在上面的 switch 语句中添加了一些额外的代码。谢谢。 【参考方案1】:

VideoViews 是 SurfaceViews。它们通过有效地弹出一个窗口到硬件帧缓冲区来工作。但是只有一个这样的硬件帧缓冲区,您试图在两个 SurfaceView 中显示,以及使用两个 MediaPlayer 写入。因此,在尝试同时处理多个 SurfaceView 时可能会出现许多渲染错误,并且此类错误在不同设备之间不会保持一致。

最简单的答案是不要这样做。将每个 VideoView 隔离为单独的 Activity,或重构您的布局,以便您可以共享单个视频视图。

下一个最简单的答案是不要同时进行。在两个视频视图之间切换时,请先移除一个(将其从视图层次结构中完全移除),然后再激活另一个。也许在两者之间使用一个 ImageView 占位符来保持 UI 相对一致,因为使用会进行这样的切换。

【讨论】:

以上是关于一个视频视图被另一个视频视图阻止的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:如何在 webview 中阻止全屏视频?

UITableView 拖动阻止所有其他动画

视频网站 阻止迅雷劫持下载

阻止视频在移动设备的后台加载

阻止用户与底层视图的交互

尽管从点击事件中调用,Safari 仍会阻止视频上的 play()