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

news/2025/3/4 8:08:50/

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

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

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

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

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

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

1.布局文件添加TextureView和ImageView

<TextureViewandroid:id="@+id/video_view"android:layout_width="match_parent"android:layout_height="match_parent"/><ImageViewandroid: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() {@Overridepublic void onSurfaceTextureAvailable(@NonNull SurfaceTexture surfaceTexture, int i, int i1) {Surface mSurface = new Surface(surfaceTexture);exoPlayer.setSurface(mSurface);LOG.info("onSurfaceTextureAvailable");}@Overridepublic void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surfaceTexture, int i, int i1) {LOG.info("onSurfaceTextureSizeChanged");}@Overridepublic boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surfaceTexture) {LOG.info("onSurfaceTextureDestroyed");return false;}@Overridepublic void onSurfaceTextureUpdated(@NonNull SurfaceTexture surfaceTexture) {myViewBinding.ivpip.setImageBitmap(myViewBinding.videoView.getBitmap());}};

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

myViewBinding.videoView.setSurfaceTextureListener(mTextureListener);


http://www.ppmy.cn/news/1576495.html

相关文章

校园订餐微信小程序(全套)

网络技术的快速发展给各行各业带来了很大的突破&#xff0c;也给各行各业提供了一种新的管理模块和校园订餐模块&#xff0c;对于校园订餐小程序将是又一个传统管理到智能化信息管理的改革&#xff0c;对于传统的校园订餐管理&#xff0c;所包括的信息内容比较多&#xff0c;对…

Nginx+PHP+MYSQL-Ubuntu在线安装

在 Ubuntu 上配置 Nginx、PHP 和 MySQL 的步骤如下&#xff1a; 1. 更新系统包 首先&#xff0c;确保系统包是最新的&#xff1a; sudo apt update sudo apt upgrade2. 安装 Nginx 安装 Nginx&#xff1a; sudo apt install nginx启动并启用 Nginx 服务&#xff1a; sudo…

家政一城一店融合小程序怎么开通,需要哪些资质?

手把手教你开通洗衣洗鞋团购上门融合小程序&#xff01; ⚠️ 抖音新规重大调整&#xff01;2025年起家政洗护必须"一城一店" &#xff08;全国仅限365家连锁资质&#xff0c;地级市单店垄断&#xff01;&#xff09; &#x1f4a1; 开通秘籍三步走&#xff1a; ✅…

DeepSeek实操教程(清华、北大)

文末清华大学及北京大学DeepSeek下载地址 1. 地址 2. 提示词 模板&#xff1a;我要&#xff08;做&#xff09;xxx&#xff0c;要给xxx用&#xff0c;希望达到xxx效果&#xff0c;但担心xxx问题 3. 软件联动 基本原则&#xff1a;Deepseek生成内容&#xff0c;以其它软件…

仿12306购票系统(3)

前面完成了乘车人登录功能的实现&#xff0c;本篇主要是控制台方面的管理 对于整体的控制台的设计&#xff0c;为了能够快速的检验&#xff0c;不进行登录拦截&#xff0c;在控制台的这个模块的controller层增加admin&#xff0c;以及在登录界面的拦截器排除掉admin. 车站 即…

正式页面开发-登录注册页面

整体路由设计&#xff1a; 登录和注册的切换是切换组件或者是切换内容&#xff08;v-if和 v-else)&#xff0c;因为点击两个之间路径是没有变化的。也就是登录和注册共用同一个路由。登录是独立的一级路由。登录之后进到首页&#xff0c;有三个大模块&#xff1a;文章分类&…

无人机研发企业内容卷严重,如何突破困境?

无人机研发企业面临内容卷&#xff08;即行业内竞争激烈、同质化严重&#xff09;的困境时&#xff0c;可以从以下几个方面寻求突破&#xff1a; 一、明确市场定位与差异化竞争 1. 市场细分&#xff1a;深入研究无人机市场&#xff0c;明确目标客户群体和应用场景&#xff0c;…

【深度学习】Hopfield网络:模拟联想记忆

Hopfield网络是一种经典的循环神经网络&#xff0c;由物理学家John Hopfield在1982年提出。它的核心功能是模拟联想记忆&#xff0c;类似于人类大脑通过部分信息回忆完整记忆的能力。以下是通俗易懂的解释&#xff1a; 1. 核心思想 想象你看到一张模糊的老照片&#xff0c;虽然…