录屏推流

最近更新时间:2024-08-22 17:24:41

我的收藏

功能介绍

手机录屏直播,即可以直接把主播的手机画面作为直播源,同时可以叠加摄像头预览,应用于游戏直播、移动端 App 演示等需要手机屏幕画面的场景。腾讯云 LiteAVSDK 通过 V2TXLivePusher 接口提供录屏推流能力,如下是 SDK API-Example 工程中演示录屏推流的相关操作界面:
说明
直播中叠加摄像头预览,即通过在手机上添加浮框,显示摄像头预览画面。录屏的时候会把浮框预览画面一并录制下来,达到叠加摄像头预览的效果。




限制说明

Android 5.0 系统以后开始支持录屏功能。
悬浮窗在部分手机和系统上需要通过手动设置打开。

示例代码

对接攻略

1. 下载 SDK 开发包

下载 SDK 开发包,并按照 SDK 集成指引 将 SDK 嵌入您的 App 工程中。

2. 给 SDK 配置 License 授权

1. 获取 License 授权:
若您已获得相关 License 授权,需在 云直播控制台 获取 License URL 和 License Key。


若您暂未获得 License 授权,需先参考 新增与续期 License 进行申请。
2. 在您的 App 调用 SDK 相关功能之前(建议在 Application 类中)进行如下设置:
public class MApplication extends Application {

@Override
public void onCreate() {
super.onCreate();
String licenceURL = ""; // 获取到的 licence url
String licenceKey = ""; // 获取到的 licence key
V2TXLivePremier.setLicence(this, licenceURL, licenceKey);
V2TXLivePremier.setObserver(new V2TXLivePremierObserver() {
@Override
public void onLicenceLoaded(int result, String reason) {
Log.i(TAG, "onLicenceLoaded: result:" + result + ", reason:" + reason);
}
});
}
注意
License 中配置的 packageName 必须和应用本身一致,否则会推流失败。

3. 添加 Activity

在 manifest 文件中粘贴如下 activity(若项目代码中存在则不需要添加)。
<activity
android:name="com.tencent.rtmp.video.TXScreenCapture$TXScreenCaptureAssistantActivity"
android:theme="@android:style/Theme.Translucent"/>

4. 初始化 V2TXLivePusher 组件

创建一个V2TXLivePusher对象,该对象负责完成推流的主要工作。
// 指定对应的直播协议为 RTMP,该协议不支持连麦
V2TXLivePusher mLivePusher = new V2TXLivePusherImpl(this, V2TXLiveDef.V2TXLiveMode.TXLiveMode_RTMP);
// 指定对应的直播协议为 RTC,该协议支持连麦。如果在直播过程中有连麦需求,需要选择该协议
V2TXLivePusher mLivePusher = new V2TXLivePusherImpl(this, V2TXLiveDef.V2TXLiveMode.TXLiveMode_RTC);
说明
如果您有连麦需求,需要创建V2TXLivePusher对象时选择RTC协议。RTC协议与RTMP协议在 API 使用上没有区别。

5. 启动推流

调用 startScreenCapture 启动屏幕录制,然后调用 V2TXLivePusher 中的 startPush 接口开始推流:
说明
如果在 第4步 中选择 RTMP 协议推流,推流地址的生成请参见 RTMP 地址。 如果在 第4步 中选择 RTC 协议推流,推流地址的生成请参见 RTC 地址
// 根据推流协议传入对应的 URL 即可启动推流, RTMP 协议以 rtmp:// 开头,该协议不支持连麦
String url = "rtmp://test.com/live/streamid?txSecret=xxxxx&txTime=xxxxxxxx";
// 根据推流协议传入对应的 URL 即可启动推流, RTC 协议以 trtc:// 开头,该协议支持连麦
String url = "trtc://cloud.tencent.com/push/streamid?sdkappid=1400188888&userId=A&usersig=xxxxx";
mLivePusher.startMicrophone();
mLivePusher.startScreenCapture();
int ret = mLivePusher.startPush(url);
if (ret == V2TXLIVE_ERROR_INVALID_LICENSE) {
Log.i(TAG, "startRTMPPush: license 校验失败");
}
注意
返回 V2TXLIVE_ERROR_INVALID_LICENSE 的原因? 如果startPush接口返回V2TXLIVE_ERROR_INVALID_LICENSE,则代表您的 License 校验失败了,请检查 第2步:给 SDK 配置 License 授权 中设置的 url 和 key。
startScreenCapture 的作用是启动屏幕录制,由于录屏是基于 Android 系统的原生能力实现的,出于安全考虑,Android 系统会在开始录屏前弹出提示,允许即可。

6. 设置 Logo 水印

设置 V2TXLivePusher 中的 setWatermark 可以让 SDK 在推出的视频流中增加一个水印,水印位置是由传入参数 (x, y, scale) 所决定。
SDK 所要求的水印图片格式为 PNG 而不是 JPG,因为 PNG 这种图片格式有透明度信息,因而能够更好地处理锯齿等问题(将 JPG 图片修改后缀名是不起作用的)。
(x, y, scale) 参数设置的是水印图片相对于推流分辨率的归一化坐标。假设推流分辨率为:540 × 960,该字段设置为:(0.1,0.1,0.1),那么水印的实际像素坐标为:(540 × 0.1,960 × 0.1,水印宽度 × 0.1,水印高度会被自动计算)。
//设置视频水印
mLivePusher.setWatermark(BitmapFactory.decodeResource(getResources(),R.drawable.watermark), 0.03f, 0.015f, 1f);

7. 推荐的清晰度

调用 V2TXLivePusher 中的setVideoQuality接口,可以设定观众端的画面清晰度。之所以说是观众端的画面清晰度,是因为主播看到的视频画面是未经编码压缩过的高清原画,不受设置的影响。而setVideoQuality设定的视频编码器的编码质量,观众端可以感受到画质的差异。详情请参见 设定画面质量

8. 提醒主播“网络不好”

如果主播在推流时遇到网络很差的情况,需要有一个友好的提示,提示主播应当检查网络。


通过 V2TXLivePusherObserver 里的 onWarning 可以捕获 V2TXLIVE_WARNING_NETWORK_BUSY 事件,它代表当前主播的网络已经非常糟糕,出现此事件即代表观众端会出现卡顿。此时就可以像上图一样在 UI 上弹出一个“弱网提示”。
@Override
public void onWarning(int code, String msg, Bundle extraInfo) {
if (code == V2TXLiveCode.V2TXLIVE_WARNING_NETWORK_BUSY) {
showNetBusyTips(); // 显示网络繁忙的提示
}
}

9. 横竖屏适配

大多数情况下,主播习惯以“竖屏持握”手机进行直播拍摄,观众端看到的也是竖屏分辨率的画面(例如 540 × 960 这样的分辨率);有时主播也会“横屏持握”手机,这时观众端期望能看到是横屏分辨率的画面(例如 960 × 540 这样的分辨率),如下图所示:


V2TXLivePusher 默认推出的是竖屏分辨率的视频画面,如果希望推出横屏分辨率的画面,可以修改 setVideoQuality 接口的参数来设定观众端的画面横竖屏模式。
mLivePusher.setVideoQuality(mVideoResolution, isLandscape ? V2TXLiveVideoResolutionModeLandscape : V2TXLiveVideoResolutionModePortrait);

10. 结束推流

因为用于推流的V2TXLivePusher对象同一时刻只能有一个在运行,所以结束推流时要做好清理工作。
// 结束录屏直播,注意做好清理工作
public void stopPublish() {
mLivePusher.stopScreenCapture();
mLivePusher.setObserver(null);
mLivePusher.stopPush();
}

事件处理

事件监听

SDK 通过 V2TXLivePusherObserver 代理来监听推流相关的事件通知和错误通知,详细的事件表和错误码表请参见 错误码表

错误通知

SDK 发现部分严重问题,推流无法继续。
事件 ID
数值
含义说明
V2TXLIVE_ERROR_FAILED
-1
暂未归类的通用错误
V2TXLIVE_ERROR_INVALID_PARAMETER
-2
调用 API 时,传入的参数不合法
V2TXLIVE_ERROR_REFUSED
-3
API 调用被拒绝
V2TXLIVE_ERROR_NOT_SUPPORTED
-4
当前 API 不支持调用
V2TXLIVE_ERROR_INVALID_LICENSE
-5
license 不合法,调用失败
V2TXLIVE_ERROR_REQUEST_TIMEOUT
-6
请求服务器超时
V2TXLIVE_ERROR_SERVER_PROCESS_FAILED
-7
服务器无法处理您的请求

警告事件

SDK 发现部分警告问题,但 WARNING 级别的事件都会触发一些尝试性的保护逻辑或者恢复逻辑,而且有很大概率能够恢复。
事件 ID
数值
含义说明
V2TXLIVE_WARNING_NETWORK_BUSY
1101
网络状况不佳:上行带宽太小,上传数据受阻
V2TXLIVE_WARNING_VIDEO_BLOCK
2105
当前视频播放出现卡顿
V2TXLIVE_WARNING_CAMERA_START_FAILED
-1301
摄像头打开失败
V2TXLIVE_WARNING_CAMERA_OCCUPIED
-1316
摄像头正在被占用中,可尝试打开其他摄像头
V2TXLIVE_WARNING_CAMERA_NO_PERMISSION
-1314
摄像头设备未授权,通常在移动设备出现,可能是权限被用户拒绝了
V2TXLIVE_WARNING_MICROPHONE_START_FAILED
-1302
麦克风打开失败
V2TXLIVE_WARNING_MICROPHONE_OCCUPIED
-1319
麦克风正在被占用中,例如移动设备正在通话时,打开麦克风会失败
V2TXLIVE_WARNING_MICROPHONE_NO_PERMISSION
-1317
麦克风设备未授权,通常在移动设备出现,可能是权限被用户拒绝了
V2TXLIVE_WARNING_SCREEN_CAPTURE_NOT_SUPPORTED
-1309
当前系统不支持屏幕分享
V2TXLIVE_WARNING_SCREEN_CAPTURE_START_FAILED
-1308
开始录屏失败,如果在移动设备出现,可能是权限被用户拒绝了
V2TXLIVE_WARNING_SCREEN_CAPTURE_INTERRUPTED
-7001
录屏被系统中断