水印处理
您可以在视频流上添加水印,适用于客户端用户自主添加个性化水印。
添加水印有两种控制方式,本文仅介绍方案一:
- 方案一:使用客户端 SDK 提供的
setWatermark
方法添加图片水印。客户端发布的视频流会带有图片水印,因此订阅分流或合流的直播观众均能看到带水印的视频流。 - 方案二:使用服务端 API 的
/rtc/mcu/config
接口在服务端处理,添加时间戳水印、文字水印或图片水印。该方式支持为单人视频流或合流视频添加水印,但只有订阅合流的观众可看到带水印的视频流。本文不介绍服务端方案,如需了解,请参见服务端文档直播合流。
方案一适用于客户端用户自主添加个性化水印;方案二更适用于由 App 统一添加风格一致的水印。
客户端与服务端添加的水印相互独立。如果同时使用,订阅合流的观众可能会看到水印叠加。
设置水印
提示
SDK 自 5.1.16 版本起提供内置水印接口。
RCRTCVideoOutputStream
内置了设置水印的接口。调用 setWatermark(Bitmap icon, RCRTCRect rect)
可为相机、自定义文件、共享桌面采集到的视频流添加水印。每一道视频流的水印设置相互独立。
Java
boolean setWatermark(Bitmap icon, RCRTCRect rect);
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
icon | Bitmap | 是 | 水印图片。传入 null 时清除水印 |
rect | RCRTCRect | 是 | 水印位置和尺寸参数。取值范围 0 ~ 1,SDK 会根据视频分辨率计算实际像素位置与尺寸 |
rect
为归一化坐标,左上角为原点,范围 0 ~ 1。x
:水印 x 坐标,取值范围 0 ~ 1(浮点数)。y
:水印 y 坐标,取值范围 0 ~ 1(浮点数)。width
:水印宽度,取值范围 0 ~ 1。例如,宽度为 480 × 0.2 = 96 px。height
:无需设置,SDK 会根据水印图片的宽高比自动计算合适高度。
例如,当前视频的编码分辨率为 480(宽)× 640(高),且 rect = (0.1f, 0.1f, 0.2f)
。则水印左上角坐标为(480 × 0.1,640 × 0.1)即(48,64),水印宽度为 480 × 0.2 = 96 px,高度由 SDK 按水印图片宽高比自动计算。
兼容性说明:自 5.1.17 起,
rect
参数类型由RCRect
调整为RCRTCRect
。
函数声明
Java
/**
* 设置水印
*
* @param logoIcon 水印图片;为 null 时移除水印
* @param rect 水印大小与位置(归一化坐标,范围 0 ~ 1)
* @return 设置是否成功
*
* Added from 5.1.16
*/
boolean setWatermark(Bitmap logoIcon, RCRTCRect rect);
示例代码
Java
// 添加水印
Bitmap icon = BitmapFactory.decodeFile(path);
RCRTCRect rect = new RCRTCRect(0.5f, 0.5f, 0.2f);
boolean ret = RCRTCEngine.getInstance().getDefaultVideoStream().setWatermark(icon, rect);
// 清除水印(传入 null)
boolean ret = RCRTCEngine.getInstance().getDefaultVideoStream().setWatermark(null, rect);
注意事项
- 请勿使用过大的水印图片。建议图片宽高均不超过 200 px,否则可能影响图片转 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" />