专栏首页音视频学习TRTC Android端开发接入学习之实现实时屏幕分享(四)
原创

TRTC Android端开发接入学习之实现实时屏幕分享(四)

前言

在完成上一篇文章中我们知道了如何集成到项目中,本节我们来实现其中比较简单的一个功能,熟悉SDK的用法。屏幕分享代码在DEMO->trtcmeetingdemo module中

腾讯云 TRTC 在 Android 系统上支持屏幕分享,即将当前系统的屏幕内容通过 TRTC SDK 分享给房间里的其他用户。关于此功能,有两点需要注意:

TRTC Android 版本的屏幕分享并不像桌面端版本一样支持“辅路分享”,因此在启动屏幕分享时,摄像头的采集需要先被停止,否则会相互冲突。

当一个 Android 系统上的后台 App 在持续使用 CPU 时,很容易会被系统强行杀掉,而且屏幕分享本身又必然会消耗 CPU。要解决这个看似矛盾的冲突,我们需要在 App 启动屏幕分享的同时,在 Android 系统上弹出悬浮窗。由于 Android 不会强杀包含前台 UI 的 App 进程,因此该种方案可以让您的 App 可以持续进行屏幕分享而不被系统自动回收。如下图所示:

支持的平台

iOS

Android

Mac OS

Windows

Electron

微信小程序

Chrome 浏览器

×

启动屏幕分享

要开启 Android 端的屏幕分享,只需调用 TRTCCloud 中的 startScreenCapture() 接口即可。

/**
 * 启动屏幕分享
 *
 * Android 手机的屏幕分享的推荐配置参数:
 * - 分辨率(videoResolution):1280 x 720
 * - 帧率(videoFps):10 FPS
 * - 码率(videoBitrate):1200 kbps
 * - 分辨率自适应(enableAdjustRes):false
 *
 * @param encParams 设置屏幕分享时的编码参数,推荐采用上述推荐配置,如果您指定 encParams 为 null,则使用您调用 startScreenCapture 之前的编码参数设置。
 * @param screenShareParams 设置屏幕分享的特殊配置,其中推荐设置 floatingView,windowManager也可以达到同样的 效果
 */
public abstract void startScreenCapture(TRTCCloudDef.TRTCVideoEncParam encParams, TRTCCloudDef.TRTCScreenShareParams screenShareParams);

但如果要达到稳定和清晰的分享效果,您需要关注如下两个问题:

设定视频编码参数

通过设置 startScreenCapture() 中的首个参数 encParams ,您可以指定屏幕分享的编码质量。如果您指定 encParams 为 null,SDK 会自动使用之前设定的编码参数,我们推荐的参数设定如下:

参数项

参数名称

常规推荐值

文字教学场景

分辨率

videoResolution

1280 × 720

1920 × 1080

帧率

videoFps

10 FPS

8 FPS

最高码率

videoBitrate

1600 kbps

2000 kbps

分辨率自适应

enableAdjustRes

NO

NO

由于屏幕分享的内容一般不会剧烈变动,所以设置较高的 FPS 并不经济,推荐10 FPS即可。

如果您要分享的屏幕内容包含大量文字,可以适当提高分辨率和码率设置。

最高码率(videoBitrate)是指画面在剧烈变化时的最高输出码率,如果屏幕内容变化较少,实际编码码率会比较低。

弹出悬浮窗以避免被强杀

从 Android 7.0 系统开始,切入到后台运行的普通 App 进程,但凡有 CPU 活动,都很容易会被系统强杀掉。 所以当 App 在切入到后台默默进行屏幕分享时,通过弹出悬浮窗的方案,可以避免被系统强杀掉。 同时,在手机屏幕上显示悬浮窗也有利于告知用户当前正在做屏幕分享,避免用户泄漏个人隐私。

方案1:弹出普通的悬浮窗 要弹出类似“腾讯会议”的迷你悬浮窗,您只需要参考示例代码 FloatingView.java 中的实现即可:

public void showView(View view, int width, int height) {
        mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
        //TYPE_TOAST仅适用于4.4+系统,假如要支持更低版本使用TYPE_SYSTEM_ALERT(需要在manifest中声明权限)
        //7.1(包含)及以上系统对TYPE_TOAST做了限制
        int type = WindowManager.LayoutParams.TYPE_TOAST;
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
            type = WindowManager.LayoutParams.TYPE_PHONE;
        }
        mLayoutParams = new WindowManager.LayoutParams(type);
        mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
        mLayoutParams.flags |= WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
        mLayoutParams.width = width;
        mLayoutParams.height = height;
        mLayoutParams.format = PixelFormat.TRANSLUCENT;
        mWindowManager.addView(view, mLayoutParams);
}

方案2:弹出摄像头预览窗 由于 TRTC Android 版本的屏幕分享并不像桌面端版本一样支持“辅路分享”,因此在启动屏幕分享时,摄像头这一路的视频数据无法上行,否则会相互冲突。 那要如何才能做到同时分享屏幕和摄像头画面呢? 答案很简单:只需要在屏幕上悬浮一个摄像头画面即可,这样一来,TRTC 在采集屏幕画面的同时也会将摄像头画面一并分享出去。

观看屏幕分享

当房间里有一个用户启动了屏幕分享,房间里的其他用户会通过 TRTCCloudListener 中的 onUserSubStreamAvailable 事件 获得这个通知。 希望观看屏幕分享的用户可以通过 startRemoteSubStreamView 接口来启动渲染远端用户辅流画面。

//第一步回调收到消息
 @Override
 public void onUserSubStreamAvailable(String userId, boolean available) {
    if (mDelegate != null) {
    mDelegate.onTRTCSubStreamAvailable(userId, available);
}
}
//第二步  TrtcMeeting中接口收到消息
TrtcMeetingImpl.onTrtcSubStreamAvailable
//第三步 通知用户进入
TRTCMeetingDelegate.onUserVideoAvailable
//第四步  AdapterNotify
mMemberListAdapter.notifyItemChange
//第五步 统一处理 
public void startRemoteView(final String userId, final TXCloudVideoView view, final TRTCMeetingCallback.ActionCallback callback) {
    runOnMainThread(new Runnable() {
        @Override
        public void run() {
            //判断是否辅流播放
            String realUserId = mSubStreamMap.get(userId);
            if (realUserId != null) {
                //播放辅流
                TXTRTCMeeting.getInstance().startPlaySubStream(realUserId, view, new TXCallback() {
                    @Override
                    public void onCallback(int code, String msg) {
                        if (callback != null) {
                            callback.onCallback(code, msg);
                        }
                    }
                });
                return;
            }

            TXTRTCMeeting.getInstance().startPlay(userId, view, new TXCallback() {
                @Override
                public void onCallback(int code, String msg) {
                    if (callback != null) {
                        callback.onCallback(code, msg);
                    }
                }
            });
        }
    });
}

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • TRTC Android端开发接入学习之实现语音聊天室(九)

    多人语音是音视频通话的常见应用场景之一,TRTC对着这方面的支持必不可少,本次我们学习如何使用TRTC快速开发语音聊天室功能。

    腾讯云-hongyang
  • TRTC Android端开发接入学习之互动直播(七)

    近年来,直播兴起,各家直播平台的火爆,支持演唱会的直播、主播、明星直播和带货直播等等等,TRTC提供了简便快捷完整的直播互动解决方案,这次我们来一起学习如何在a...

    腾讯云-hongyang
  • TRTC Android端开发接入学习之常见问题(十一)

    V1和V2主要区别在于IM的SDK是否内嵌于TRTC中,V1线路是内嵌,而V2则可选,默认不打包IM的SDK包。V2在通话质量、线路规格、接入难度以及功能扩展上...

    腾讯云-hongyang
  • 3D打印为你的时尚生活带来哪些改变?

    随着3D打印技术的不断发展,生产商已经可以随心所欲的打印出新颜色、新材质的作品了。意大利公司Gruppo Meccaniche Luciani近日便利用Stra...

    机器人网
  • 大数据系统架构实践线下活动精彩回顾

    2018年3月22日晚,加米谷大数据第三期大数据系统架构实践线下实战分享会结束啦!

    加米谷大数据
  • 声波病毒:拔网线照常攻击,通过耳机盗取数据

    在传统时代,如果一台联网电脑感染病毒,单位的IT管理员一定会说“先拔掉网线”,因为网线是病毒传播的实体通道。然而,美国的研究者发现,新型电脑病毒...

    安恒信息
  • 通过替代文本描述使LinkedIn媒体更具包容性

    原文 https://engineering.linkedin.com/blog/2019/alternative-text-descriptions

    LiveVideoStack
  • 微信JSSDK分享功能图文实例详解

    这里以微信分享到朋友圈,分享给微信好友为例为参考,进行调用测试,想添加其他的功能,自行查看开发人员文档即可

    砸漏
  • 终于,我也到了和Eclipse说再见的时候,难说再见

    优秀的赛车手,除了过硬的技术之外,拥有一部性能炸裂的赛车驰骋赛道,随之而来的必然是一座座冠军奖杯;优秀的篮球手,没有一双优秀的篮球鞋,在激烈的对抗中不占上风,纵...

    程序员小跃
  • TCP与UDP的区别

    在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,完成三次握手,客户端与服务器开始传送数据。

    用户7657330

扫码关注云+社区

领取腾讯云代金券