Android双屏异显副屏实现PIP效果小窗口同步显示主屏播放画面

在KTV应用开发中一个常见的场景需求就是一台设备要接多个显示屏,其中一个主屏一般都是触摸屏,通过VGA线连接,支持手点击操作点歌切歌等。另外还会有多个副屏,一般都是电视机,通过HDMI线连接。

有一个特点就是所有电视显示屏的播放MV画面都是同步,而触摸屏上也会有一个小窗口同步显示播放MV画面。那么这个是怎么实现的呢?所有副屏画面同步很容易,物理方法就可以实现,接一个HDMI多屏拓展器就可以。而主屏是VGA输出的,而且主要是显示操作界面的,跟电视上的画面并不完全一样,也就是双屏异显,只是小窗口画面一样,这就需要软件上来处理了。

首先是要实现双屏异显,通过Presentation类实现副屏显示,之前有过这方面介绍android 双屏异显场景,如何使副屛Presentation响应遥控操作

而主屏(触摸屏)小窗口同步显示副屏电视端HDMI播放画面,首先想到的就是有没有办法将播放画面拷贝过来?一般有两种方式:

方式一:底层修改Surfaceflinger,将HDMI上显示的layer层试图直接拷贝到副屏上显示,此方法一般是设备厂家ROM开发,有系统源码才可以实现。

方式二:独立普通应用实现,不依赖底层,Exoplayer+TextureView实现,textureView.getBitmap()方法就可以直接得到当前播放帧的位图,在主屏MainActivity通过ImageView进行显示即可。

1.布局文件添加TextureView和ImageView

复制代码
    <TextureView
        android:id="@+id/video_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />


    <ImageView
        android:id="@+id/iv_pip"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_gravity="left|top"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="@dimen/size_dp_10" />

2.自定义TextureListener,在回调中得到surface设置给Exoplayer

复制代码
    private TextureView.SurfaceTextureListener mTextureListener = new TextureView.SurfaceTextureListener() {
        @Override
        public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surfaceTexture, int i, int i1) {
            Surface mSurface = new Surface(surfaceTexture);
           exoPlayer.setSurface(mSurface);
            LOG.info("onSurfaceTextureAvailable");
        }

        @Override
        public void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surfaceTexture, int i, int i1) {
            LOG.info("onSurfaceTextureSizeChanged");
        }

        @Override
        public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surfaceTexture) {
            LOG.info("onSurfaceTextureDestroyed");
            return false;
        }

        @Override
        public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surfaceTexture) {
            myViewBinding.ivpip.setImageBitmap(myViewBinding.videoView.getBitmap());
          
        }
    };

3.给TextureView设置监听,在更新画面回调onSurfaceTextureUpdated中获取当前帧画面位图设置到ImageView中进行显示。

复制代码
myViewBinding.videoView.setSurfaceTextureListener(mTextureListener);
相关推荐
QING61820 分钟前
Kotlin 操作符与集合/数组方法详解——新手指南
android·kotlin·app
张风捷特烈20 分钟前
Flutter 伪 3D 绘制#1 | 三维空间
android·flutter
stringwu26 分钟前
白话kotlin协程
android
QING61837 分钟前
Kotlin 中 == 和 === 的区别
android·kotlin·app
林十一npc43 分钟前
MySQL索引与视图综合应用示例解析
android·前端·mysql
恒拓高科WorkPlus2 小时前
局域网视频软件BeeWorks Meet,企业内部安全会议不断线
网络·安全·音视频
QING6182 小时前
Kotlin containsValue用法及代码示例
android·kotlin·源码阅读
QING6182 小时前
Kotlin coerceAtMost用法及代码示例
android·kotlin·源码阅读
QING6182 小时前
Kotlin commonSuffixWith用法及代码示例
android·kotlin·源码阅读
QING6182 小时前
Kotlin coerceAtLeast用法及代码示例
android·kotlin·源码阅读