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);
相关推荐
2501_915106328 分钟前
iOS 性能优化这件事,结合多工具分析运行期性能问题
android·ios·性能优化·小程序·uni-app·cocoa·iphone
千里马学框架15 分钟前
如何使用豆包手机的READ_FRAME_BUFFER权限截图密码画面
android·智能手机·framework·安卓framework开发·权限·截图·secure
游戏开发爱好者818 分钟前
App Store 上架流程,结合多工具协作
android·ios·小程序·https·uni-app·iphone·webview
阿道夫小狮子18 分钟前
android 音频抢占问题
android·音视频
光锥智能19 分钟前
火山引擎发布豆包大模型1.8和音视频创作模型Seedance 1.5 pro
音视频·火山引擎
lusasky20 分钟前
批量压缩对象存储中视频
音视频
千殇华来22 分钟前
音频基础知识(一)
音视频
山西茄子27 分钟前
Issac sim 做测试视频
音视频·deepstream
Black蜡笔小新29 分钟前
视频汇聚平台EasyCVR如何赋能重塑安防与物联可视化
音视频
撩得Android一次心动30 分钟前
Android 四大组件——Service(服务)【基础篇1】
android·服务·四大组件