水印处理
融云支持在视频流上添加水印,适用于 App 客户端用户自主添加个性化水印。
添加水印有两种控制方式,本文仅介绍方案一:
- 方案一:使用客户端 SDK 提供的
setWatermark
方法添加图片水印。客户端发布的视频流即带有图片水印,因此订阅分流或合流的直播观众均会看到带水印的视频流。 - 方案二:使用服务端 API 的
/rtc/mcu/config
接口,在服务端处理,添加时间戳水印、文字水印或图片水印。这种方式支持为单人视频流或合流视频添加水印,但只有订阅合流的观众可看到带水印的视频流。本文不介绍服务端的处理方案,如有需要, 请参见服务端文档直播合流。
方案一适用于实现 App 客户端用户自主添加个性化水印;方案二更适用于由 App 添加统一风格的水印。
客户端与服务端添加的水印相互独立。如果同时使用,则订阅合流的观众可能会看到水印叠加。
设置水印
提示
SDK 从 5.1.16 版本开始,提供内置水印接口。
RCRTCVideoOutputStream
内置了设置水印的接口,通过调用 setWatermark(Bitmap icon, RCRect rect)
方法即可实现为相机、自定义文件、共享桌面采集到的视频流添加水印的功能。每一道视频流水印设置是独立的。
boolean setWatermark(Bitmap icon, RCRect rect);
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
icon | Bitmap | 是 | 水印图片,传入 null 时则清除水印。 |
rect | RCRTCRect | 是 | 水印的位置和尺寸参数。 注意:参数取值范围 0 ~ 1,SDK 内部会根据视频分辨率计算水印实际的像素位置和尺寸。 注意:SDK 5.1.17 及之后版本,该参数类型从 RCRect 改为了 RCRTCRect 。 |
- rect 是归一化的,左上角为原点,范围 0~1。
- x:水印 x 坐标。取值范围 0~1 浮点数。
- y:水印 y 坐标。取值范围 0~1 浮点数。
- width:水印的宽度,取值范 围 0~1。例如,宽度是 480 × 0.2 = 96px
- height:无需设置,SDK 内部会根据水印图片的宽高比自动计算一个合适的高度
例如,当前视频的编码分辨率是 480(宽) × 640(高),且 rect 参数被您设置为(0.1f,0.1f,0.2f)。那么水印的左上坐标点就是(480 × 0.1,640 × 0.1),即(48,64),水印的宽度是 480 × 0.2 = 96px,水印的高度会根据水印图片的宽高比由 SDK 自动算出。
函数声明
/**
* 设置水印
*
* @param logoIcon 水印图片, 如果参数null, 移除水印
* @param rect 水印大小位置尺寸
* @return 水印设置是否成功
* <p>
* added from 5.1.16 </br>
* rect 是归一化的,左上角为原点,范围 0~1
* x: 水印x坐标 :取值范围0~1浮点数
* y: 水印y坐标 :取值范围0~1浮点数
* width: 水印的宽度,取值范围 0~1 exp:宽度是 480 × 0.2 = 96px
* height: 无需设置,SDK内部会根据水印图片的宽高比自动计算一个合适的高度
* 例如: 当前视频的编码分辨率是 480 × 640,且 rect 参数被您设置为(0.1,0.1,0.2)
* 那么水印的左上坐标点就是(480 × 0.1,640 × 0.1)即(48,64)
* 水印的宽度是 480 × 0.2 = 96px,水印的高度会根据水印图片的宽高比由 SDK 自动算出
*/
boolean setWatermark(Bitmap logoIcon, RCRTCRect rect);
示例代码
//添加水印
Bitmap icon = BitmapFactory.decodeFile(path);
RCRTCRect rect = new RCRTCRect(0.5f, 0.5f, 0.2f);
boolean ret = RCRTCEngine.getInstance().getDefaultVideoStream().setWatermark(icon, rect);
// 清除水印
boolean ret = RCRTCEngine.getInstance().getDefaultVideoStream().setWatermark(null, rect);
注意事项
-
添加水印图片不宜过大。建议图片宽高均不超过 200px,否则会影响图片转 Bitmap 的生成。
-
禁止程序循环反复调用添加/清除水印接口。
-
水印功能需要AndroidManifest.xml 打开外部存储读写权限;Android 6.0 以上需要动态申请
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />