在录制中添加水印

  • C++

更新时间不可用

了解本地服务端录制在不同平台上的在录制中添加水印方式,包括接入流程、关键配置和平台差异。

功能简介

在录制视频的过程中,你可以通过添加水印,如公司 Logo、时间戳或自定义文字信息,实现防伪、版权声明、宣传或记录等目的。声网服务端 SDK 支持在单流和合流录制下,对录制视频添加水印。支持的水印类型包括:

  • 文字水印:使用一段文字作为水印,可设置字体和字号。
  • 动态时间戳水印:使用录制服务器的当前时间作为水印,显示形式为 2025-06-18 14:30:35。
  • 静态图片水印:使用一张本地 PNG 或 JPG 图片作为水印。

本文介绍如何在使用声网服务端录制 SDK 的录制过程中添加各种类型的水印。

前提条件

开始前,请确保你已经参考开始录制音视频在项目中集成了录制 SDK 并实现了基础的录制功能。

实现方法

无论是单流录制,还是合流录制,SDK 都支持在录制视频过程中添加水印。下文以合流录制为例,介绍实现水印功能时核心的参数设置。

你可以通过 enableAndUpdateVideoWatermarks 开启或更新水印设置:

C++
int enableAndUpdateVideoWatermarks(WatermarkConfig* watermark_configs, int num)

其中,watermark_configs 为具体的水印数组指针;num 为水印个数。

如果需要关闭水印功能,可以调用 disableVideoWatermarks 实现。

信息

单流录制场景下,实现的水印功能与合流录制一致。两者的差异在于不同场景下,调用的 API 不同。单流下:

添加水印文字

通过以下步骤添加文字水印:

  1. 调用 enableAndUpdateVideoWatermarks 方法,并设置相应的 watermark_configs 参数。
  2. 设置水印类型为文字水印:watermark_configs.type = agora::rtc::LITERA。
  3. 配置文字水印的内容 wmLitera、字体 fontFilePath 和大小 fontSize。
C++
// 设置水印类型为 LITERA,即文字
watermarks[i].type = agora::rtc::LITERA;
// 设置文字内容
watermarks[i].literaSource.wmLitera = "声网水印示例";
// 设置字体文件路径(如不设置,使用默认字体)
watermarks[i].literaSource.fontFilePath = "path/to/font.ttf";
// 设置字体大小
watermarks[i].literaSource.fontSize = 24;

添加时间戳水印

通过以下步骤添加时间戳水印:

  1. 调用 enableAndUpdateVideoWatermarks 方法,并设置相应的 watermark_configs 参数
  2. 设置水印类型为时间戳水印:watermark_configs.type = agora::rtc::TIMESTAMPS
  3. 配置时间戳水印的字体 fontFilePath 和大小 fontSize。
C++
// 设置水印类型为 TIMESTAMPS,即时间戳
watermarks[i].type = agora::rtc::TIMESTAMPS;
// 设置字体文件路径(如不设置,使用默认字体)
watermarks[i].timestampSource.fontFilePath = "path/to/font.ttf";
// 设置字体大小
watermarks[i].timestampSource.fontSize = 20;

添加图片水印

通过以下步骤添加图片水印:

  1. 调用 enableAndUpdateVideoWatermarks 方法,并设置相应的 watermark_configs 参数
  2. 设置水印类型为图片水印:watermark_configs.type = agora::rtc::PICTURE。
  3. 配置图片水印的路径 imageUrl。
C++
// 设置水印类型为 PICTURE,表示图片
watermarks[i].type = agora::rtc::PICTURE;
// 设置图片路径
watermarks[i].imageUrl = "path/to/watermark.png";

设置水印位置

无论添加哪种水印,都需要设置水印在视频中的位置。SDK 在 WatermarkConfig 结构体中提供了两种位置设置模式。

固定像素值 FIT_MODE_COVER_POSITION

使用固定的像素点确定水印在画面中的位置,需要分别设置横屏和竖屏模式下的位置:

  • 竖屏模式的水印位置

    C++
    // 设置固定像素模式
    watermarks[i].options.mode = agora::rtc::FIT_MODE_COVER_POSITION;
    // 设置水印的图层编号,值越大水印层级越高
    watermarks[i].options.zOrder = 1;
    
    // 设置竖屏模式下的水印位置
    watermarks[i].options.positionInPortraitMode.x = 50;       // 水平偏移
    watermarks[i].options.positionInPortraitMode.y = 50;       // 垂直偏移
    watermarks[i].options.positionInPortraitMode.width = 200;  // 水印宽度
    watermarks[i].options.positionInPortraitMode.height = 100; // 水印高度
  • 横屏模式的水印位置

    C++
    // 设置固定像素模式
    watermarks[i].options.mode = agora::rtc::FIT_MODE_COVER_POSITION;
    // 设置水印的图层编号,值越大水印层级越高
    watermarks[i].options.zOrder = 1;
    
    // 设置横屏模式下的水印位置
    watermarks[i].options.positionInLandscapeMode.x = 50;       // 水平偏移
    watermarks[i].options.positionInLandscapeMode.y = 50;       // 垂直偏移
    watermarks[i].options.positionInLandscapeMode.width = 200;  // 水印宽度
    watermarks[i].options.positionInLandscapeMode.height = 100; // 水印高度

相对比例 FIT_MODE_USE_IMAGE_RATIO

使用相对的比例来确定水印在画面中的位置:

C++
// 设置相对比例模式
watermarks[i].options.mode = agora::rtc::FIT_MODE_USE_IMAGE_RATIO;
// 设置水印的z序,值越大水印层级越高
watermarks[i].options.zOrder = 1;

// 设置水印的相对位置和大小
watermarks[i].options.watermarkRatio.xRatio = 0.5;      // 相对于视频宽度的水平位置比例
watermarks[i].options.watermarkRatio.yRatio = 0.5;      // 相对于视频高度的垂直位置比例
watermarks[i].options.watermarkRatio.widthRatio = 0.6;  // 相对于视频宽度的水印宽度比例

完整示例代码

实现水印功能时,你可以参考如下示例:

C++
//  设置多个水印
for(int i = 0; i < config.waterMarks.size(); i++){
    
    watermarks[i].index = i+1;

    if(config.waterMarks[i].type == Literal){  //  设置文字水印
        watermarks[i].type = agora::rtc::LITERA;
        watermarks[i].literaSource.wmLitera = config.waterMarks[i].literalMark.litera.c_str();
        watermarks[i].literaSource.fontFilePath = config.waterMarks[i].literalMark.fontFilePath.c_str();
        watermarks[i].literaSource.fontSize = config.waterMarks[i].literalMark.fontSize;
    } else if(config.waterMarks[i].type == Time) {  //  设置时间戳水印
        watermarks[i].type = agora::rtc::TIMESTAMPS;
        watermarks[i].timestampSource.fontFilePath = config.waterMarks[i].timeMark.fontFilePath.c_str();
        watermarks[i].timestampSource.fontSize = config.waterMarks[i].timeMark.fontSize;
    } else if(config.waterMarks[i].type == Picture){  //  设置图片水印
        watermarks[i].type = agora::rtc::PICTURE;
        watermarks[i].imageUrl = config.waterMarks[i].pictureMark.image_url.c_str();
    }
 
    // 用固定像素值的方式设置水印位置,注意要横屏和竖屏模式都要设置;
    watermarks[i].options.mode = agora::rtc::FIT_MODE_COVER_POSITION;
    watermarks[i].options.zOrder = config.waterMarks[i].pos.zorder;
    watermarks[i].options.positionInPortraitMode.x = config.waterMarks[i].pos.x;
    watermarks[i].options.positionInPortraitMode.y = config.waterMarks[i].pos.y;
    watermarks[i].options.positionInPortraitMode.width = config.waterMarks[i].pos.width;
    watermarks[i].options.positionInPortraitMode.height = config.waterMarks[i].pos.height;
    watermarks[i].options.positionInLandscapeMode.x = config.waterMarks[i].pos.x;
    watermarks[i].options.positionInLandscapeMode.y = config.waterMarks[i].pos.y;
    watermarks[i].options.positionInLandscapeMode.width = config.waterMarks[i].pos.width;
    watermarks[i].options.positionInLandscapeMode.height = config.waterMarks[i].pos.height;
}

后续步骤

完成水印设置后,你可以进一步:

  • 设置多个水印:可以组合使用不同类型的水印,通过设置不同的 zOrder 来控制水印的叠加顺序
  • 更新水印:可以通过再次调用 enableAndUpdateVideoWatermarks 方法来更新已有的水印
  • 关闭水印:如需关闭水印,可以调用 disableVideoWatermarks() 方法

参考信息