背景

公司许多项目大多都有音视频生产的功能,一般视频生产添加水印的功能,水印尺寸比较固定基本上都是业务方来自己编写和计算展示水印的尺寸。但是遇到水印不断变化以及前后端同时生成水印视频,且要确保不同分辨率与不同宽高比例在添加水印后,在不同分辨率的手机上呈现出相同比例的水印视频就是一件比较麻烦的一件事了。

首先如何解决这个问题,得需要了解一下水印视频生成的原理。

原理

视频添加水印功能一般包含图像部分和文字部分,图像部分又分为图片或者是视频,文字部分是通过外部传入的文字内部进行转换成图片进行处理的。

Untitled

目前编辑SDK内部的使用的坐标系,初始点为左上角(0,0),终点是右下角(100,100),而这边计算水印的位置是通过水印本身的中心点来做计算的。

Untitled

水印图像的分辨率的宽和高的1/2分别与屏幕的宽高相除,得到的数值就是这个图像在屏幕的位置比例信息,然后根据水印在四个角的位置属性来计算具体的位置点,然后转换为编辑SDK的坐标系就完成了位置计算。

在水印视频的分辨率不变的情况下,把一个200*200的水印图片合成到原始视频上时,如果我们不做任何的处理,在转吗后得到的水印视频分别在576p,720p,1080P的分辨率时,会显示的大小是不一样的,因为像素是固定不变的,当我们把一个固定分辨率的视频合成到不同分辨率的原始视频时就会发生这种情况。为了解决这问题,就需要动态的缩小或者放大水印的尺寸。
如果默认情况下不做处理水印在各种分辨率结果如下:

为了计算水印缩放的系数,我们需要首先确认这个水印的基础比例值,考虑到我们很多视频转码导出基本上是以720P的规格,所以内部是以720的分辨率为基准的。

计算逻辑为 scale = 原始的动画scale + (导出视频分辨率的最短的边 / 720.0 - 1)

比如说我一个200 * 200的水印转码导出时视频分辨率如下情况:
(原始的动画scal为1时)
320 * 576 时缩放比例就是为 0.44
720 * 1280 时缩放比例就是为 1
1080 * 1920 时缩放比例就是为 1.5
2160 * 3840 时缩放比例就是为 3

按照这个比例动态缩放结果如下显示如下:


其实呢,水印的实际的分辨率与scale没有直接关系,这样有个好处就是不用三端同学根据具体的分辨率去计算。
这个基础比例就规范了,设计同学以后在设计的时候是以720宽的尺寸上设计水印的大小比例,这样以后只要修改水印原始素材,就可以动态的修改在任何分辨率下的比例。这样控制权完全掌握在设计手中,业务同学不需要频繁改动。
后端的同学参考了前端的计算逻辑,使得客户端和后端三端的水印逻辑统一,无论在哪个平台上生成的视频都是一样的效果。
上面提到的是图像部分,其实文字部分是和图像部分一样的计算逻辑。

其他:

  1. 对于视频动态水印的视频,水印宽度需要特殊处理,因为视频水印会带有透明阴影通道,计算的时候需要特殊处理一下,宽度为原来的一半。
  2. 水印的比例也可以由业务来维护,可以做到特殊需求的比例样式调整。
  3. 由于水印视频和文字都会有内边距,所以在动态缩放的过程中也是需要与scale计算。