水印处理
SDK 从 5.2.5 版本开始支持该功能。
融云支持在直播中在视频流上添加水印。添加水印有两种控制方式,本文仅介绍方案一:
- 方案一:使用客户端 SDK 提供的
setWatermark
方法添加图片水印。客户端发布的视频流即带有图片水印,因此订阅分流或合流的直播观众均会看到带水印的视频流。 - 方案二:使用服务端 API 的
/rtc/mcu/config
接口,在服务端处理,添加时间戳水印、文字水印或图片水印。这种方式支持为单人视频流或合流视频添加水印,但只有订阅合流的观众可看到带水印的视频流。本文不介绍服务端的处理方案,如有需要,请参见服务端文档直播合流。
提示
方案一适用于实现 App 客户端用户自主添加个性化水印;方案二更适用于由 App 添加统一风格的水印。 客户端与服务端添加的水印相互独立。如果同时使用,则订阅合流的观众可能会看到水印叠加。
设置水印
RCRTCEngine
内置了设置水印的接口,通过调用 setWatermark
方法即可实现为相机、自定义文件、共享桌面采集到的视频流添加水印的功能。每一道视频流水印设置是独立的。
方法
JavaScript
rtcEngine.setWatermark(imagePath, position, zoom);
参数说明
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
imagePath | String | 是 | 水印图片的本地路径 |
position | RCRTCIWPoint | 是 | 水印的位置。注意:参数取值范围 0 ~ 1,SDK 内部会根据视频分辨率计算水印实际的像素位置 |
zoom | Number | 是 | 水印的缩放比,注意:参数取值范围 0 < zoom ≦ 1,SDK 内部会根据视频分辨率计算水印实际的大小 |
参数详细说明
- position 是归一化的,左上角为原点,取值范围 0~1 浮点数。x 是水印 x 坐标,y 是水印 y 坐标。
- zoom:水印的缩放比,取值范围 0 < zoom ≦ 1。例如,水印图片的宽度 480 × 0.2 = 96,高度根据图片原始宽高比等比例缩放。
例如,当前视频的编码分辨率是 480(宽) × 640(高),且 position 参数被您设置为(0.1,0.1)、zoom 设置为 0.2。那么水印的左上坐标点就是(480 × 0.1,640 × 0.1),即(48,64),水印的宽度是 480 × 0.2 = 96,水印的高度会根据水印图片的宽高比由 SDK 自动算出。
示例代码
JavaScript
// 添加水印
rtcEngine.setWatermark('imagePath', { 'x': 0.1, 'y': 0.1 }, 0.2);
console.log('水印设置请求已发送');
清除水印
通过调用 RCRTCEngine
对象的 removeWatermark
方法移除客户端设置的水印。
方法
JavaScript
rtcEngine.removeWatermark();
示例代码
JavaScript
// 清除水印
rtcEngine.removeWatermark();
console.log('水印清除请求已发送');
设置水印状态监听
设置水印监听
方法
JavaScript
rtcEngine.setOnWatermarkSetListener(callback);
回调参数
参数 | 类型 | 说明 |
---|---|---|
code | Number | 错误码,0 表示成功 |
errMsg | String | 错误信息 |
示例代码
JavaScript
rtcEngine.setOnWatermarkSetListener((code, errMsg) => {
if (code == 0) {
// 水印设置成功
console.log('水印设置成功');
} else {
// 水印设置失败
console.log('水印设置失败:', errMsg);
}
});
设置水印清除监听
方法
JavaScript
rtcEngine.setOnWatermarkRemovedListener(callback);
回调参数
参数 | 类型 | 说明 |
---|---|---|
code | Number | 错误码,0 表示成功 |
errMsg | String | 错误信息 |
示例代码
JavaScript
rtcEngine.setOnWatermarkRemovedListener((code, errMsg) => {
if (code == 0) {
// 水印清除成功
console.log('水印清除成功');
} else {
// 水印清除失败
console.log('水印清除失败:', errMsg);
}
});
完整示例代码
JavaScript
// 设置水印监听
rtcEngine.setOnWatermarkSetListener((code, errMsg) => {
if (code == 0) {
console.log('水印设置成功');
} else {
console.log('水印设置失败:', errMsg);
}
});
// 添加水印
rtcEngine.setWatermark('imagePath', { 'x': 0.1, 'y': 0.1 }, 0.2);
// 设置水印清除监听
rtcEngine.setOnWatermarkRemovedListener((code, errMsg) => {
if (code == 0) {
console.log('水印清除成功');
} else {
console.log('水印清除失败:', errMsg);
}
});
// 清除水印
rtcEngine.removeWatermark();
注意事项
- 添加水印图片不宜过大。建议图片宽高均不超过 200px,否则会影响图片在安卓原生层转 Bitmap 的生成。
- 禁止程序循环反复调用添加/清除水印接口。
- 安卓端水印功能需要 AndroidManifest.xml 打开外部存储读写权限;Android 6.0 以上需要动态申请
xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />