揭秘版权保护下的视频隐形水印算法上篇

白癜风专家郑华国 http://nb.ifeng.com/a/20190627/7503025_0.shtml

视频水印,作为保护知识产权的重要手段,早已被大众习惯且接受。但是这种方法仍然存在着多方面的不足。对于观众来说,盖在画面一角的logo多少会影响到他们的观赏体验。对于视频所有者来说,这种直接显示在画面上的水印也很容易被定位和攻击。一些厂家为了应对这些攻击,将水印时不时地从随机的方向插入到画面里,从而增加delogo的难度,但这就更进一步降低了观众的观看体验。针对这些问题,隐形水印这门技术被提出并逐渐发展了起来。接下来,本文将分上下篇为读者介绍几种主要的隐形水印技术。

水印都能藏在哪些地方把水印加到封装结构里

首先,我们用一个最简单的例子来引入一类完全不会修改画面内容的隐形水印,也即封装结构层的水印。这个例子叫图种。一部分读者也许听说过这种东西。在国内版权意识逐渐普及的时期,网络上公开可下载的无授权资源逐渐被封禁,图种开始作为资源传播的手段小范围流行起来。它看上去就是一张普通的jpeg图片,但是下载下来后,zip解压软件居然能对它进行解压,之后就能得到隐藏在图片背后的其他数据。其原理,就是利用了文件的封装结构来隐藏数据。说得详细一点,jpeg格式的文件,是以一串固定数据(0xFFD9)结尾的[1],而zip格式的文件,也有其固定的起始码(0xB50)[2]。通过将一个jpeg文件和一个zip文件直接拼接,就可以产生图种。大部分图片浏览器和解压软件都有对数据首尾位置不正常的情况做兼容,所以它们可以正常处理这类文件。

图种可以被正常显示

那么,图种毕竟只是图片,

如果是视频,是否也存在利用封装结构来隐藏数据的方法呢?那可太多了。事实上,大部分视频格式都有存储附属信息的结构,我们只要把数据藏在那里就行了。下面简单举两个例子。

flv文件flv文件由一个header和大量的tag组成,这些tag分为三类:

audio、video和scriptdata。其中scriptdata的格式标准允许我们插入各种自定义数据[3],我们可以对照官方文档来实现代码修改这个tag的数据。嫌麻烦的话,一些开源软件也支持在一定程度上的修改它,比如flvmeta:

使用flvmeta修改flv文件,加入自定义数据

实际存储在文件中的数据

H.码流在flv、mp4、mkv等文件格式上添加数据,意味着视频必须以离线文件的形式存在。如果我们希望在直播或者视频通话中的视频数据上添加水印呢?这时我们可以在更下一层,也就是视频码流层下手。可能有读者对码流这个概念不是很清楚。视频数据原本只是一个个像素值,经过编码器压缩后的数据一般就称为码流或比特流(bitstream)。视频码流虽然也可以直接解码播放,但是只能得到一帧一帧的画面,不包含准确的时间信息,也不包含给播放器跳转用的数据偏移量,更没有音频和字幕。所以它需要更上一级的封装格式提供给播放器附加信息以保证正常播放。视频编码有很多标准,现在使用最广泛的H.标准中,有一段数据叫做SEI(补充增强信息,supplementalenhancementinformation),它被用来存储辅助解码与显示的信息,支持添加用户的自定义数据[4]。著名的开源编码器x就在这段数据里写了自己的版本信息以及编码参数。我们可以参照格式标准生成自己定义的SEI数据,再嵌入视频码流中,从而实现隐形水印。

自定义SEI的语法标准

x生成的SEI数据

封装结构层的水印是所有隐形水印中运算量最小的,因为它不会对视频原始数据进行处理。但是其缺点也很明显。因为视频在被盗用时极可能被人重新编码存储,在这个过程中,事先添加在这一层的水印一般都会丢失。因此这类方法仅在一些特殊的场景被使用。接下来,本文将介绍直接添加在画面内容中的隐形水印。

把水印加到像素里

通过修改像素值添加隐形水印的方法非常之多,本节仅介绍其中最简单一种方法。即直接修改LSB数据。所谓LSB,指的是最低有效位(LeastSignificantBit),可以认为是像素值中最无关紧要的一个比特。直接修改它对视觉影响很小。下图的十个方块,蓝色分量的像素值依次由递增至,相邻的两个方块相当于修改了LSB数据。

修改LSB数据较难被肉眼分辨

有了这个认识,再来做水印就很简单了。我们先把水印数据转化成只有0和1的二值图像,然后直接写到目标图像的最低位上,这样就完成了水印的嵌入。除了可以用这种方法嵌入纯黑白的logo,


转载请注明:http://www.aierlanlan.com/rzdk/8360.html