录屏推流

最近更新时间:2026-04-20 17:34:07

我的收藏

功能介绍

手机录屏直播,即可以直接把主播的手机画面作为直播源,同时可以叠加摄像头预览,应用于游戏直播、移动端 App 演示等需要手机屏幕画面的场景。腾讯云 LiteAVSDK 通过 V2TXLivePusher 接口提供录屏推流能力。

限制说明

鸿蒙系统录屏功能需要用户授权屏幕录制权限,系统会在开始录屏前弹出授权提示,允许即可。

对接攻略

步骤1:下载 SDK 开发包

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

步骤2:给 SDK 配置 License 授权

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

若您暂未获得 License 授权,需先参考 新增与续期 License 进行申请。
2. 在您的 App 调用全功能版 SDK 相关功能之前进行如下设置:
import { getV2TXLivePremierShareInstance } from 'liteavsdk';

export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
let licenseUrl: string = "<获取到的licenseUrl>";
let licenseKey: string = "<获取到的key>";

getV2TXLivePremierShareInstance(this.context).setLicence(licenseUrl, licenseKey);
}
}
注意:
License 中配置的 bundleName 必须和应用本身一致,否则会推流失败。

步骤3:创建 Pusher

视频云 SDK 中的 V2TXLivePusher 模块负责实现推流功能。
import { createV2TXLivePusher, V2TXLivePusher, V2TXLiveMode } from 'liteavsdk';

@Entry
@Component
struct ScreenPush {
// 在 struct 成员变量区声明,指定推流协议
// 指定对应的直播协议为 RTMP,该协议不支持连麦
private pusher: V2TXLivePusher = createV2TXLivePusher(getContext(), V2TXLiveMode.V2TXLiveModeRTMP);
// 指定对应的直播协议为 RTC,该协议支持连麦。如果在直播过程中有连麦需求,需要选择该协议
// private pusher: V2TXLivePusher = createV2TXLivePusher(getContext(), V2TXLiveMode.V2TXLiveModeRTC);
}
说明:
如果您有连麦需求,需要创建 V2TXLivePusher 对象时选择 RTC 协议。RTC 协议与 RTMP 协议在 API 使用上没有区别。

步骤4:启动推流

调用 startScreenCapture 启动屏幕录制,然后调用 V2TXLivePusher 中的 startPush 接口开始推流:
说明:
如果在 步骤3 中选择 RTMP 协议推流,推流地址的生成请参见 RTMP 地址
如果在 步骤3 中选择 RTC 协议推流,推流地址的生成请参见 RTC 地址
startScreenPush(): void {
// 根据推流协议传入对应的 URL 即可启动推流,RTMP 协议以 rtmp:// 开头,该协议不支持连麦
let url: string = "rtmp://test.com/live/streamid?txSecret=xxxxx&txTime=xxxxxxxx";
// 根据推流协议传入对应的 URL 即可启动推流,RTC 协议以 trtc:// 开头,该协议支持连麦
// let url: string = "trtc://cloud.tencent.com/push/streamid?sdkappid=1400188888&userId=A&usersig=xxxxx";

this.pusher.startMicrophone();
this.pusher.startScreenCapture();

let ret: number = this.pusher.startPush(url);
if (ret === V2TXLiveCode.V2TXLIVE_ERROR_INVALID_LICENSE) {
console.error("startPush: license 校验失败");
}
}
注意:
返回 V2TXLIVE_ERROR_INVALID_LICENSE 的原因?
如果 startPush 接口返回 V2TXLIVE_ERROR_INVALID_LICENSE,则代表您的 License 校验失败了,请检查 步骤2:给 SDK 配置 License 授权 中设置的 url 和 key
startScreenCapture 的作用是启动屏幕录制,由于录屏基于鸿蒙系统的原生能力实现,出于安全考虑,鸿蒙系统会在开始录屏前弹出提示,允许即可。

步骤5:设置 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,水印高度会被自动计算)。
import fs from '@ohos.file.fs';

// 将水印图片从 rawfile 写入沙箱路径后,传入文件路径
let content = getContext().resourceManager.getRawFileContentSync('watermark.png');
let path = getContext().getApplicationContext().filesDir + '/image/watermark.png';
let file = fs.openSync(path, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
fs.writeSync(file.fd, content.buffer);
fs.closeSync(file);

// 设置视频水印
this.pusher.setWatermark(path, 0.03, 0.015, 1);


步骤6:推荐的清晰度

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

步骤7:提醒主播“网络不好”

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

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


步骤8:横竖屏适配

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

V2TXLivePusher 默认推出的是竖屏分辨率的视频画面,如果希望推出横屏分辨率的画面,可以修改 setVideoQuality 接口的参数来设定观众端的画面横竖屏模式。
import { V2TXLiveVideoEncoderParam, V2TXLiveVideoResolution, V2TXLiveVideoResolutionMode } from 'liteavsdk';

startScreenPush(): void {
let param: V2TXLiveVideoEncoderParam =
new V2TXLiveVideoEncoderParam(V2TXLiveVideoResolution.V2TXLiveVideoResolution960x540);
param.videoResolutionMode = this.isLandscape
? V2TXLiveVideoResolutionMode.V2TXLiveVideoResolutionModeLandscape
: V2TXLiveVideoResolutionMode.V2TXLiveVideoResolutionModePortrait;
this.pusher.setVideoQuality(param);

// ... 后续调用 startPush,也可以将该功能抽离为一个功能按钮
}

步骤9:结束推流

因为用于推流的V2TXLivePusher 对象同一时刻只能有一个在运行,所以结束推流时要做好清理工作。
// 结束录屏直播,注意做好清理工作
stopScreenPush(): void {
this.pusher.stopScreenCapture();
this.pusher.setObserver(null);
this.pusher.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
录屏被系统中断。