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);
相关推荐
m0_6145235512 小时前
普通视频怎么做多场景一镜到底:路线设计、逐段衔接与整体验收
人工智能·音视频
天空之城--15 小时前
Android逆向安全合规接单指南
android·安全
Pocker_Spades_A17 小时前
视频不用再一张张截图:ClipSketch AI 把关键画面转成漫画,还能顺手生成文案
人工智能·音视频
星辰徐哥17 小时前
本地视频预览别只自己看:把Remotion动效项目发给客户远程验收
docker·ai·node.js·html·音视频·react·remotion
镜像视界(浙江)科技有限公司17 小时前
《视频孪生之上:二维展示终结,三维空间计算重构城市逻辑》——跨摄像连续表达 × 三角测量厘米级定位 × 动态轨迹建模,构建新一代城市空间
大数据·人工智能·算法·矩阵·音视频·空间计算
消失的旧时光-194317 小时前
Android 系统层扫盲 09:AMS、ATMS、WMS、PMS 到底分别管什么?
android·wms·pms·ams·aosp·atms
你不是我我17 小时前
【AI 测评】想用自己的声音给视频配音?Index-TTS本地部署这样做
人工智能·音视频
Godikov17 小时前
Android 系统级设备应用踩坑实录:sharedUserId 签名、SDK 授权失败 -4、开机自启与 U 盘 OTA 升级
android
Ulyanov20 小时前
AudioVision Pro:基于 PySide6 + sounddevice 的实时音频可视化播放器设计
python·算法·音视频
福大大架构师每日一题20 小时前
ComfyUI v0.34.0发布:视频、音频、三维、显存与合作节点全面更新
音视频