ZWMAP 水印类型规范

1. 概述

水印类型用于描述视频画面上叠加的水印元素,支持图片水印、文字水印、动态游走水印和铺满水印。常用于品牌标识、版权声明、用户追踪和防录屏保护。使用 在线水印编辑工具 可以可视化配置和导出水印数据。

水印数据通过 watermarks 参数传入播放器,支持三种输入格式:

  1. URL 字符串:指向一个 ZWMAP JSON 文件的地址
  2. ZWMAP 对象:包含完整协议头的 JSON 对象
  3. 水印数组:直接传入 watermarks 数组(无协议头)

2. ZWMAP 头部

{
  "zwp_protocol": "ZWMAP/1.0",
  "zwp_type": "watermark"
}

3. 数据结构

3.1 根级别字段

字段 类型 必填 默认值 说明
zwp_protocol string 是 — 协议标识,固定 "ZWMAP/1.0"
zwp_type string 是 — 固定 "watermark"
zwp_version string 否 "1.0" 数据格式版本
watermarks array 是 — 水印条目数组

3.2 水印条目通用字段

字段 类型 必填 默认值 说明
id string 否 — 水印条目唯一标识
type string 是 — 水印类型:"image" 或 "text"
behavior string 否 "static" 行为模式:"static"、"dynamic"、"tile"
dock string 否 "right" 停靠方向:"left" 或 "right",影响 x 的参考原点
x string 否 "5%" 水平位置,支持像素值或百分比
y string 否 "5%" 垂直位置,支持像素值或百分比
width string 否 "5%" 宽度,支持像素值或百分比
height string 否 "auto" 高度,支持像素值、百分比或 "auto"
opacity number 否 70 不透明度,0-100
hidden boolean 否 false 是否隐藏

3.3 图片水印字段(type: "image")

字段 类型 必填 默认值 说明
icon string 是 — 图片 URL(支持 Base64 data URI)

3.4 文字水印字段(type: "text")

字段 类型 必填 默认值 说明
text string 是 — 水印文本内容,支持模板变量
font_size number 否 14 字体大小(px)
font_color string 否 "rgba(255,255,255,0.4)" 字体颜色,支持 RGBA

3.5 动态行为字段(behavior: "dynamic")

字段 类型 必填 默认值 说明
movement object 否 — 运动参数
movement.direction string 否 "diagonal" 移动方向:"horizontal"、"vertical"、"diagonal"、"random"
movement.speed number 否 2 移动速度,1-10
movement.interval number 否 0 隐藏等待时间(秒),0 表示持续显示
movement.duration number 否 0 每次显示持续时间(秒),0 表示持续显示

3.6 铺满行为字段(behavior: "tile",仅 type: "text")

字段 类型 必填 默认值 说明
tile object 否 — 铺满参数
tile.angle number 否 -30 倾斜角度(度),-90 到 90
tile.rowSpacing number 否 120 行间距(px)
tile.colSpacing number 否 300 列间距(px)

4. 行为模式

4.1 static — 静态水印

水印固定在指定位置,适合品牌 Logo 和固定版权声明。

  • dock 决定 x 坐标的参考原点(左边缘或右边缘)
  • 切换 dock 方向时,x 值需相应转换(如 5% → 95%)

4.2 dynamic — 动态游走

水印在画面上移动,是防录屏的关键手段。

  • 水印在容器内移动,碰到边界自动反弹
  • 设置 interval 和 duration 可实现显示/隐藏的周期循环
  • 隐藏后重新出现时,从上次消失的位置继续移动

4.3 tile — 铺满水印(仅文字)

文字以倾斜网格铺满整个画面,形成密集水印矩阵。

  • 网格尺寸按画面对角线计算,确保旋转后无空白
  • 仅 type: "text" 支持

5. 模板变量

文字水印的 text 字段支持 {key} 模板变量,在播放时动态解析。

5.1 内置变量

变量 说明 更新频率
{sys_time} 客户端本地时间(YYYY-MM-DD HH:mm:ss) 每秒

5.2 自定义变量

通过播放器的 variables 参数传入:

new ZWPlayer({
  url: 'video.mp4',
  watermarks: config.watermarks,
  variables: {
    user_id: '138****1234',
    user_name: 'John',
    department: 'Engineering'
  }
});

未解析的变量原样显示。

6. 完整示例

{
  "zwp_protocol": "ZWMAP/1.0",
  "zwp_type": "watermark",
  "zwp_version": "1.0",
  "watermarks": [
    {
      "id": "wm-logo",
      "type": "image",
      "behavior": "static",
      "icon": "https://cdn.example.com/logo.png",
      "dock": "right",
      "x": "3%",
      "y": "3%",
      "width": "8%",
      "opacity": 70
    },
    {
      "id": "wm-text",
      "type": "text",
      "behavior": "static",
      "text": "{user_name} | {department}",
      "dock": "left",
      "x": "3%",
      "y": "90%",
      "font_size": 16,
      "font_color": "rgba(255,255,255,0.5)",
      "opacity": 60
    },
    {
      "id": "wm-dynamic",
      "type": "text",
      "behavior": "dynamic",
      "text": "{user_id} | {sys_time}",
      "font_size": 14,
      "font_color": "rgba(255,255,255,0.3)",
      "opacity": 40,
      "movement": {
        "direction": "diagonal",
        "speed": 3,
        "interval": 0,
        "duration": 0
      }
    },
    {
      "id": "wm-tile",
      "type": "text",
      "behavior": "tile",
      "text": "Confidential",
      "font_size": 16,
      "font_color": "rgba(255,255,255,0.08)",
      "opacity": 20,
      "tile": {
        "angle": -30,
        "rowSpacing": 120,
        "colSpacing": 300
      }
    }
  ]
}

7. 约束规则

  1. watermarks 数组不得为空
  2. 每个条目必须包含 type 字段
  3. type 为 image 时,必须提供 icon
  4. type 为 text 时,必须提供 text
  5. opacity 取值范围 0-100,推荐值 20-70
  6. behavior: "tile" 仅适用于 type: "text"
  7. 动态水印推荐透明度 20-40,平衡防录屏效果与观看体验
  8. 多个水印可同时使用,位置不应完全重叠
  9. 水印不响应鼠标事件,不阻塞播放器交互