Skip to content

WaterMark

buliaoyin edited this page Aug 29, 2017 · 14 revisions

SDK支持为视频添加水印效果,包含,静态图片水印、时间水印和动态水印。
水印效果在预览和播放端都可生效。
水印功能在推流过程中可动态修改。

1. 水印Bitmap和路径设置

SDK支持图片水印的路径配置,以及直接设置Bitmap对象的方式。

1.1水印路径设置

有两种方式设置:
方式一: 指定sdcard目录下的文件,需要指定前缀file://, 例如mLogoPath = "file:///sdcard/test.png";
方式二: 指定assets目录下面的文件,需要指定前缀assets://,例如mLogoPath = "assets://test.png";

2. 图片水印设置方式

通过KSYStreamer的接口showWaterMarkLogohideWaterMarkLogo来显示和隐藏水印

注意,v4.0开启水印后,在切后台的case中,需要开发者在Activity的onPause回调中hide水印,onResume中再show出来。

接口说明:

/**
 * Show watermark logo both on preview and stream.
 *
 * @param bitmap logo bitmap, should not be recycled by caller
 * @param x      x position for left top of logo relative to the video, between 0~1.0.
 * @param y      y position for left top of logo relative to the video, between 0~1.0.
 * @param w      width of logo relative to the video, between 0~1.0, if set to 0,
 *               width would be calculated by h and logo image radio.
 * @param h      height of logo relative to the video, between 0~1.0, if set to 0,
 *               height would be calculated by w and logo image radio.
 * @param alpha  alpha value,between 0~1.0
 */
public void showWaterMarkLogo(Bitmap bitmap, float x, float y, float w, float h, float alpha);

/**
 * 设置并显示logo水印
 *
 * @param path  logo图片文件的路径
 * @param x     logo的显示位置,0-1之间,相对于视频
 * @param y     logo的显示位置,0-1之间,相对于视频
 * @param w     logo的显示宽度,0-1之间,相对于视频,为0时会根据h及logo图片的比例自适应
 * @param h     logo的显示高度,0-1之间,相对于视频,为0时会根据w及logo图片的比例自适应
 * @param alpha logo的透明度,0-1之间
 */
void showWaterMarkLogo(String path, float x, float y, float w, float h, float alpha);

/**
 * 隐藏logo水印
 */
void hideWaterMarkLogo();

如果宽或高设置为0,SDK内部会自行根据logo的原始比例进行计算

3. 时间水印设置方式

通过KSYStreamer的接口showWaterMarkTimehideWaterMarkTime来显示和隐藏时间水印

接口说明:

/**
 * 在推流视频中显示时间水印
 *
 * @param x     时间戳的显示位置,0-1之间,相对于视频
 * @param y     时间戳的显示位置,0-1之间,相对于视频
 * @param w     时间戳的显示宽度,0-1之间,相对于视频,高度会自适应
 * @param color 时间戳的颜色
 * @param alpha 时间戳的显示透明度,0-1之间
 */
void showWaterMarkTime(float x, float y, float w, int color, float alpha);

/**
 * 隐藏推流视频中的时间水印
 */
void hideWaterMarkTime();

代码示例:

mStreamer.showWaterMarkLogo(mLogoPath, 0.08f, 0.06f, 0.27f, 0.15f, 0.8f);
mStreamer.showWaterMarkTime(0.02f, 0.015f, 0.4f, Color.RED, 1.0f);

4. 动态水印的支持

SDK从v4.3.1开始在demo中加入了支持动态水印的示例代码,可以支持gif, webp格式的动态图片水印。

在Demo中,第二次开启水印即可看到动态水印效果。

注意:软编兼容模式下,不支持动态水印。

Demo中的 AnimatedImageCapture 类使用fresco库的pipeline方法,将动图解码后转化为texture输出。 使用时,将该采集模块的输出端连接到预览和编码mixer的空闲index上,然后开始解码即可。

代码使用示例如下:

  • 初始化
// 在Application的onCreate中初始化Fresco库
Fresco.initialize(this);

// 创建AnimatedImageCapture
mAnimatedImageCapture = new AnimatedImageCapture(mStreamer.getGLRender());
  • 开启动态水印,参数设置方法与图片水印相同
// show animated watermark logo, support gif/webp, not valid in SOFTWARE_COMPAT mode
private void showAnimatedWaterMark(String url, float x, float y, float w, float h, float a) {
    // 连接到空闲的预览、编码mixer上
    mAnimatedImageCapture.getSrcPin().connect(mStreamer.getImgTexPreviewMixer().getSinkPin(3));
    mAnimatedImageCapture.getSrcPin().connect(mStreamer.getImgTexMixer().getSinkPin(3));
    // 配置水印显示位置及大小
    mStreamer.getImgTexPreviewMixer().setRenderRect(3, x, y, w, h, a);
    mStreamer.getImgTexMixer().setRenderRect(3, x, y, w, h, a);
    // 开始显示
    mAnimatedImageCapture.start(this, url);
}
  • 关闭动态水印
private void hideAnimatedWaterMark() {
    mAnimatedImageCapture.stop();
    mAnimatedImageCapture.getSrcPin().disconnect(false);
}
Clone this wiki locally