发明内容
本发明的目的是提供一种流媒体数字水印系统,为实现上述目的本发明采用的技术方案如下:
一种流媒体数字水印系统,包括一个服务器端和至少一个客户端,
所述服务器端完成视频数据的实时采集,视频数据的压缩编码,视频数据的存储与转发,以及处理普通用户的连接与点播请求;
所述客户端完成与服务器端的连接,视频数据的传输,视频数据的解码播放,以及此过程中水印信息的提取和校验。
所述服务器端的组成包括:
1)一个视频数据采集模块,所述视频数据采集模块完成视频数据的捕捉和缓存;
2)一个视频数据编码模块,所述视频数据编码模块完成对捕捉到的原始图像数据进行压缩编码;
3)一个数字水印信息嵌入模块,所述模块读入设置好的数字水印信息,并按一定算法嵌入至所述视频数据编码模块编码得到的码流中;
4)一个流媒体服务器,所述流媒体服务器处理用户连接,并完成视频数据的存储和转发。
所述客户端的组成包括:
1)一个网络连接模块,所述网络连接模块负责与流媒体服务器进行连接,接收流媒体服务器发送的视频数据;
2)一个数字水印信息提取模块,所述数字水印信息提取模块与所述视频数据解码模块配合工作,完成数字水印信息的提取和校验;
3)一个视频数据解码模块,所述视频数据解码模块完成对网络传送来的视频数据进行解码;
4)一个视频播放模块,所述视频播放模块能够将所述视频数据解码模块解码得到的视频数据还原成图像数据并在屏幕上进行播放。
所述视频数据采集模块从摄像头中捕捉动态实时数据,保存成原始的图像格式,并对原始的图像数据进行简单编码,将保存后的YUV格式的图像数据进行缓存。
所述视频数据编码模块包括几个MPEG4视频编码器,所述视频编码器对所有缓存的图像数据,完成从YUV图像至MPEG4格式视频数据的压缩编码。所述视频编码器处理缓冲区里的连续图像序列,并每一帧图像序列自适应地使用最合适的编码方式对其进行编码。
所述数字水印信息嵌入模块支持三种数字水印嵌入模式:
1)直接在数字摄像头采集到的图像数据里嵌入数字水印;
2)在视频编码器的编码过程中离散余弦变换(DCT)之前嵌入数字水印;
3)在视频编码器的编码过程中离散余弦变换(DCT)之后嵌入数字水印,也可以认为是直接在编码完成的码流中进行嵌入。
所述流媒体服务器包括一个媒体库,其设置在专用的流媒体服务器上,完成视频数据的分类存储。其中可存储的内容包括编码完成的MPEG4格式视频文件,或者编码完成的MPEG4格式的视频流。
所述流媒体服务器可接受用户的连接请求,正确识别用户的媒体访问指令,从媒体库中读取相应的视频文件或者视频流,按媒体访问的通用协议格式,通过网络发送给用户主机。
所述网络连接模块使用媒体访问的通用协议,向服务器端发送连接请求,连接成功后接收相应的视频数据,并在客户端主机上进行重组和缓存。
所述数字水印信息提取模块,分析网络连接模块从流媒体服务器接收到的MPEG4视频数据包,判断其中是否包含数字水印信息并完成相应的处理,输出经过处理的MPEG4视频数据。
所述视频数据解码模块将所述数字水印信息提取模块处理完的视频数据解码输出为YUV图像序列到视频播放模块进行播放。
所述视频数据编码模块的MPEG4视频编码器支持的MPEG4视频编码格式标准包括ffmpeg,Divx,Xvid等几种。
所述视频数据编码模块的视频编码器对图像序列进行编码时,对于其中与之前帧内容变化剧烈的图像帧,编码器将其编码为I帧;对于与之前帧变化较小的图像帧,编码器将其编码为P帧或者B帧。
所述数字水印信息嵌入模块为可选模块,当应用中需要进行版权保护或者需要在传输流中嵌入相应的秘密信息时,该模块可为传输流添加相应的水印信息。该模块分析编码器得到的码流数据,在其缓冲区内找到视频编码产生的冗余部分,选择其中的部分冗余缓冲区作为水印信息的嵌入位置。该模块使用了有效的数字水印算法,读入长度有严格限制的水印信息,对其进行简单的变换,然后按一定算法嵌入至视频码流缓冲区中经过选择的冗余位置。在完成了水印信息的嵌入之后,该模块将修改后的MPEG4视频数据重新整合,使其的有效数据长度与缓冲区总长度保持正确的值。该模块将嵌入水印信息之后的视频数据发送至流媒体服务器,用于存储和网络传输。
所述数字水印信息提取模块分析预先设置好的标志位是否已经被置好,如果发现了标志位,说明有水印信息存在,则继续提取水印;如果没有标志位,说明该数据包不含水印信息,那么直接交给解码器解码。其分析标志位的时候需要判断几个的标志位是否同时存在且标志位上的值是否正确,只有完全符合算法要求的值才会被认为包含水印信息。当确定水印信息存在时,按照水印算法从数据包相应的冗余区域提取出水印信息。
所述视频数据解码模块对于一个完整的数据包,对其进行分析和解码,根据数据包的大小最终可以拆分成一个至若干视频帧。该模块分析每一个完整的视频帧,通过与缓冲区里的前一帧数据相比较判断当前分析帧的类型。其中,如果帧类型为I帧,则单独解码;如果为P帧或者B帧,则需要结合前一帧或者前后若干帧再解码。该模块解码输出的YUV图像帧序列将送至视频播放模块进行播放。
本发明提出了一种流媒体数字水印系统,实现了在流媒体传输中完成秘密信息的传输。系统使用了愈发重要的数字水印技术,基于client/server的模式,使用主流的MPEG4编码器,完成了视频数据的采集、压缩,水印信息的嵌入和提取。本发明的重点在于数字水印信息的嵌入过程是实时地与视频数据的压缩编码相结合,在编码器完成编码的过程中将数字水印嵌入。因此,系统在实际操作时可以根据需要实时地改变数字水印信息,但无需重新制作视频文件。本发明基于普通的流媒体网络应用,通过水印信息实现了流媒体信息的访问,以及访问过程中的版权保护和鉴别。
具体实施方式
为了实现本项发明的内容,下面结合附图对本发明的优选实施例进行具体的描述。包括:
1、本发明的流媒体数字水印系统的结构图如图1所示。
其中,本发明所用系统采用了经典的Client/Server结构。本发明所设计的系统和软件需要部署在至少两台计算机上得以实施。本系统的描述如下:
1a)本系统使用一个服务器端,其计算机系统为:
一台普通网络服务器;
高性能的数字摄像头;
高性能高带宽网卡;
Linux操作系统;
视频数据采集软件;
视频编码器,编码格式支持MPEG1/MPEG2/MPEG4/H.263/H.264;
流媒体服务器软件Darwin Streaming Server;
VI编辑器,gcc编译器;
C/C++编程语言。
服务器端通过使用视频数据采集软件驱动USB摄像头采集视频数据,再使用视频编码器进行视频压缩编码,嵌入数字水印信息,最后生成的实时媒体流数据通过流媒体服务器进行调度和传输。
表1a服务器系统组成与端实施方案
硬件 |
普通服务器,具备较强计算和存储能力 |
高性能USB数字摄像头 |
高性能高带宽网卡 |
软件 |
操作系统:Linux、Windows |
数字摄像头驱动控制软件 |
视频压缩编码器 |
流媒体服务器:Darwin Streaming Server5.5.3 |
开发环境 |
开发语言:C/C++ |
编译器:gcc |
编辑器:Vim,gEdit |
调试器:gdb,Vim |
1b)本系统可以对应一至多个客户端。每个客户端所需要的计算机系统为:
一台普通的家用PC机,具备常用的CPU和显卡以保证基本的计算处理能力和视频播放能力;
网卡;
Windows系列操作系统;
开源的流媒体处理软件;
开源的媒体播放器;
Visual Studio集成开发环境;
日志记录和查看软件;
C/C++编程语言。
表1b客户端系统组成与实施方案
硬件 |
普通家用PC机,能够完成计算和视频播放 |
普通网卡 |
软件 |
操作系统:Windows系列 |
流媒体处理软件 |
流媒体播放器 |
开发环境 |
编程语言:C/C++ |
编译器:Visual Studio |
编辑器:Visual Studio |
调试器:Visual Studio |
每个客户端都可以单独连接至流媒体服务器,通过流媒体访问协议来建立连接,再通过解码模块进行视频解码和视频播放,同时在解码过程中完成数字水印信息的校验和提取。
1c)本发明使用了互联网。针对每个客户端,其所需的网络带宽为500kbps~3Mbps,网络延迟在30s以内。
客户端与服务器端的连接通过互联网实现,所有的通信协议使用标准的网络通信协议,所有的数据传输均在互联网条件下实现。
表1c系统网络传输所需条件
协议 |
网络传输:TCP,UDP |
流媒体传输专用协议:RTP,RTS P,RTCP,RTP overUDP,RTP over TCP |
网络条件 |
500Kbps~3Mbps带宽,延迟小于30秒 |
2、本发明的服务器端的组成结构以及基本流程如图2所示。
本发明的服务器端包括四个模块:视频数据采集模块,视频数据编码模块,数字水印信息嵌入模块,流媒体服务器模块。
1)视频数据采集模块,服务器端使用了高品质的数字摄像头,获取实时的图像数据。该摄像头具备通用PC机的标准接口。
本模块中使用了开源软件MPEG4IP中的MP4Live部分。MP4Live用C++编写,工作于Linux环境下,能够快速高效地驱动硬件设备,如USB摄像头和系统USB总线。
本发明使用的摄像头通过先进的CCD图像解析芯片实时获取动态图像数据,并根据其底层硬件驱动将数据编码成原始的YUV格式的图像数据,完成初步的编码。为了保证视频数据源的高质量以及实时流畅性,本发明使用的数字摄像头具备高的图像分辨率,在不使用插值扩充的情况下其具备最高720*576的图像分辨率;同时其具有高分辨率下每秒25~30帧以上的帧率,人眼不再感到明显迟滞,满足视频实时性的要求,保证了用户观看视频的流畅性。;摄像头还使用了高速的USB2.0接口与系统相连接,也保证了采集到的图像数据能够被快速连续地传送至系统缓冲区,交给视频编码器使用。在此过程中,系统还通过一些多线程和同步方式来保证接收到的原始数据被准确无误地送至编码器进行编码。
此外,在存放至编码帧队列之前,MP4Live还对原始的视频数据进行了一些必要的处理,还需要设置一些视频解析的选项,如压缩编码后视频数据的尺寸、画面亮度、画面对比度、每秒编码帧率、是否保存视频文件等。
2)视频数据编码模块,读取视频采集模块采集得到的YUV图像数据,对其进行压缩编码。
压缩编码时,其采用了开源的Xvid编码器。Xvid编码器使用了最新的1.1.0Final版本,可以完成从YUV图像序列到Xvid格式的MPEG4视频流的编码。
Xvid编码器以动态链接库的方式运行,其编码输出的是完整的一帧视频数据。在其编码的过程中,会分析当前缓冲区中缓存的图像序列,通过当前图像与之前图像之间的差异比较,来控制编码帧的格式。比如当前后画面变化剧烈的时候就将其编码成为独立的I帧,如果画面总体变化平缓则编码成为P帧(支持B帧的时候还可以编码为B帧)。
另外,Xvid编码器还可以接受显式的开关指令来设置当前编码帧的格式。比如,当需要保证画面的连续性,适时地减小运动向量预测带来的误差积累时,可以定期(每隔几秒)强制编码生成I帧,或者当编码的帧数积累达到某一个值(如100帧)时强制编码生成I帧。在本系统中使用了后一种方法,每编码完成100帧时,下一帧强制编码成I帧。在实际测试中该方法有效地减轻了误差积累带来的画面下降,1/100的强制刷新比率也没有对编码性能造成影响。
如果服务器端设置了允许录制编码结果至实际文件,那么编码器编码得到的视频数据可以被存为MPEG4视频文件。在设定的录制时间里,编码器产生的码流都会写入指定文件名的MPEG4视频文件。
3)数字水印信息嵌入模块,接收编码器生成的Xvid格式的码流,根据系统设置选择性地加入数字水印信息。
本系统搭建在Linux环境下,其中数字水印信息放在/home目录下,水印信息通过文本文件保存。实际运行的时候,管理员只需要更改该文本信息的内容,就可以简单地改变实际嵌入至视频码流中的数字水印信息。
数字水印信息被嵌入至Xvid编码生成的视频码流中,完成了数字水印信息的嵌入操作之后,经修改的新的码流就被作为实际传输所需的视频数据送至流媒体服务器,供存储和转发使用。
图3是数字水印信息嵌入模块的具体的实施方式。
在系统初始运行时,管理员可以设置是否需要嵌入数字水印信息。这项设置保证了本系统运行的灵活性,可以根据实际需求选择性地加入这一功能。
实时流媒体中数据传输流具有易丢包,易乱序的特点,本发明特别设计了符合这一应用环境的数字水印嵌入方法。对于每个从编码器传来的数据包,分析了其性质以及容量,确保了对于少量数字水印信息的嵌入不会产生为人感知的负面影响。具体的水印算法实施方式如下:
a)实时流媒体应用中一个关键的因素是实时性,无论应用的场景如何,针对的对象如何,实时性是这一类应用中应该保证了最起码的要求。实时性的具体指标,通常表现为客户端能够获得每秒至少10帧视频数据(人眼视觉要求)。而对于生成视频码流的服务器端来说,其视频编码器的编码效率必须达到每秒30帧,甚至更高。这样才能在采取若干流控和拥塞控制的前提下保证客户端相应的接收速率和播放速率。于是服务器端要求生成码流的效率必须高,采用的数字水印算法计算复杂性要低。
针对此种情况,本发明中使用了精简的数字水印算法,而且将水印嵌入位置选择在已经编码完成的视频码流中。选择这一位置不会因为水印信息的加入而需要重新进行编码和解码作用。另一方面,客户端在接收到了视频数据之后,可以先进行水印信息的提取,再解码播放。这充分保证了服务器端的编码器和客户端的解码器的运行效率不受影响,因此可以充分保障较高的帧率,使用户获得较为满意的播放体验。
b)视频编码器在生成一帧视频数据时,伴有信息冗余。实测表明,Xvid编码器生成的一帧视频数据,其大小为4~12K字节,而其中的冗余信息(即非视频编码相关数据)达到了1~2K字节。本发明利用了这些冗余信息位完成数字水印信息的嵌入。
由于编码器传来的每帧数据中具有大量的冗余位,我们选择这些冗余位作为数字水印信息的嵌入位置。实际的算法首先分析了Xvid编码器传进来的一帧视频数据中有效数据的长度Length1,此长度一定小于传进来的视频数据帧的长度Length2,即Length1<Length2,算法会分析多出来的冗余部分,即Length2-Length1的部分,确定其中哪些是完全多余(即不参与视频编码和解码)。得到了这部分信息之后,算法将从水印信息文件里的读入的信息逐位地嵌入至冗余位置中。
其中,在嵌入的过程中,算法还对水印信息进行了加密变换。为了保证转换效率和实时性,加密方法只使用了基本的位置换,比较简单。
4)流媒体服务器模块,是服务器端的最后一个环节,它读取系统相应的接口,获得视频编码器编码生成的视频码流,然后对这些码流进行一些相应处理。
流媒体服务器模块主要功能是存储和转发。其中,存储主要完成编码器编码生成的视频文件的存放和编目,而转发则是针对用户的连接请求,完成视频数据的流传输。
流媒体服务器具有一个媒体库,用于存放供用户点播的视频文件,或者视频描述符文件。
当向用户进行视频数据传输时,如果服务器端设置了水印开关,那么可以在准备传输流的同时对需要传输的视频流嵌入数字水印。
当向用户进行视频数据传输时,使用网络通用的流媒体传输协议,以及满足通用协议的数据包格式,如RTP(Real Time Protocol)、RTSP(Real Time StreamingProtocol),还可以选择使用通用流媒体传输控制协议RTCP(Real Time ControlProtocol)。
当向用户进行视频数据传输时,根据流媒体服务器的设置,针对不同的网络状况,可以选择具体的传输模式,如:
RTP over TCP
RTP over UDP
RTSP over UDP
具体采用何种策略,取决于实际使用的平台以及网络支持条件。
图4为流媒体服务器模块的具体的实施方式。
该模块负责读入Xvid编码器编码之后嵌入了数字水印信息的视频码流,存储在流媒体服务器的磁盘中,供用户点播使用。
该模块在本系统中相对服务器端其它模块较为独立,可以看成是单独的组件。
本发明中流媒体服务器使用了Apple公司的Darwin Streaming Server(下面简称Darwin)。Darwin是Apple公司面向商业用户提供的Quick Time StreamingServer的一个开源版本,针对流媒体应用开发者,方便其进行功能二次开发。功能是提供通用流媒体服务器所具备的存储(管理媒体信息),以及供用户点播所需的调度和传输。
使用Darwin很容易,仅仅需要开发人员完成一些基本的定制,其多数配置选项都是通过一个Xml格式的脚本文件进行设置,同时其中多数设置项都被设为符合绝大多数流媒体应用场景的默认参数。因此我们在使用Darwin的时候只需要按自己的需要合理地设置某几项参数,如连接超时时限,最大连接数,媒体播放时限等。
本发明中,Darwin使用了5.5.3,被部署在了Linux环境下。Darwin需要管理员设置一个基本的媒体存储目录,我们称之为Playlist,Darwin在启动之后会定时查询该目录下的媒体文件并对其进行属性分析,分析得到的结果进行归类编目。
目前为止,Darwin支持的媒体格式有三种:视频方面有MOV和MP4,音频方面支持MP3。其中,MOV为Apple公司独有的视频文件格式,而MP4则是符合ISO标准的MPEG4文件。另外,Darwin还支持以SDP协议定义的媒体信息流。本发明中正是通过MP4Live生成特定的MPEG4格式的视频数据流,因此可以被Darwin支持。
本发明在服务器端Xvid编码器输出的是MPEG4格式的编码码流,而非MP4文件,因此当使用MPEG4格式的视频数据流时,需要有一个流信息描述文件。这里我们使用了通用的SDP协议(Session Description Protocol)。SDP协议详细记录了媒体流的一些属性信息,如分辨率,视频流数据地址,视频/音频流格式,同步信息等等。我们修改了MP4Live的输出,在运行时输出一个SDP文件。该SDP文件详细描述了Xvid编码器生成的码流。Darwin通过对该SDP文件的分析就可以找到真正的视频数据流并正确定位,由此来完成对视频流数据的存储和转发。
在接受用户的连接请求后,Darwin自动在媒体库Playlist中查询相应的媒体信息,当负载合理的情况下读取媒体信息,并且按照流媒体传输的通用协议和格式组织视频数据包,完成网络传送。
3、本发明的客户端的基本构架如图5所示。
客户端包括四个模块:网络连接模块,数字水印信息提取模块,视频解码模块,视频播放模块。
1)网络连接模块,负责与发起与流媒体服务器的连接,通过连接之后接收流媒体服务器发送过来的数据包,并将其进行重排序;
优选的,还包括:当接收到流媒体服务器发送来的数据包之后,先对数据包进行网络校验,丢弃破损的包,将接收完整的包进行重组和排序,然后送至缓冲区,供解码器使用。
优选的,还包括:当向流媒体服务器进行连接请求时,使用的是标准的RTSP协议格式。
优选的,还包括:当从流媒体服务器接收数据时,根据服务器端的设置,可以有以下几种不同的传输模式,如:
RTP over TCP
RTP over UDP
RTSP over UDP
具体采用何种策略,由流媒体服务器根据于实际使用的平台以及网络支持条件来选择决定。
图6为客户端网络连接模块的基本功能与流程。
网络连接模块的功能是负责向流媒体服务器发起连接请求,请求通过之后从服务器端接收视频数据包,再完成包顺序重组。
其中,连接请求使用了流媒体中的通用访问协议RTSP(Real Time StreamingProtocol),其发送的RTSP连接请求格式如下:
rtsp://192.168.1.113/20070404.sdp
意思是向IP地址为192.168.1.113的计算机发送连接请求,请求名为20070404.sdp描述文件描述的视频流/音频流。
在请求得到通过之后,网络连接模块就开始了数据接收。这一阶段的数据接收也是使用流媒体网络传输中的通用协议RTP(Real Time Protocol)。
由于网络条件差异,路由的选择不同,顺序发送的数据包有可能不是依次到达客户端的网络接收端,因此需要对乱序的数据包们进行重排列。由于RTP协议中每一个用于传输的媒体数据包中都加入了时间戳,记录了其在传输过程中的排列顺序。因此,在客户端的网络连接模块只需要在收到数据包之后,将一定量(几秒至几分钟)的数据包缓存至缓冲区中。之后分析缓冲区中每一个包中所含的时间戳,根据时间戳的先后顺序将数据包重排。另外,网络传输中也经常会出现数据包损坏,时间戳无法提取的情况,这种情况下我们的做法是直接丢弃该数据包。
重排好的数据包序列可以暂存至解码器的缓冲区。
2)数字水印信息提取模块分析得到的数据包,对其进行校验,如果发现其中具有数字水印标识则启动提取算法,提取其中的数字水印信息。然后将去除数字水印信息之后的纯视频数据交给视频解码器;
优选的,还包括:被提取出的水印信息可以通过窗口的形式显示在客户机器的屏幕上。
优选的,还包括:被提取出的水印信息可以通过文件记录的方式写入客户机器的磁盘。
图7为客户端提取数字水印模块的基本流程。
该模块的输入为网络连接模块的输出。通过对重排序的数据进行水印检测和提取完成数字水印的操作。
该模块的数据被暂时存放在解码器的缓冲区。该模块从缓冲区中依次取回数据包。由于在传输过程中破损的数据包已经被网络连接模块丢弃,因此缓冲区内的数据包都是服从传输协议的完整的数据包。
水印提取模块分析包的结构,得到其视频数据有效域的长度,即视频解码时缓冲区的可用长度Length2。若该长度与数据包长度Length1相差不多(几十字节),可以认为数字水印信息不存在,即使存在也有较大几率被流媒体服务器调度时忽略掉。因此对于这种长度较短的数据包不进行数字水印操作,直接交给视频解码器进行解码;若Length2与Length1相差较多,则根据算法的策略,先在包里查找数字水印信息的标识。如果找到,说明该数据包里嵌入了数字水印信息。如果没有找到,可以认为数据包里没有嵌入数字水印信息,或者是数字水印信息丢失。
确定数据包里存在数字水印信息后,使用水印提取算法提取水印。提取算法与服务器端水印嵌入模块使用的嵌入算法基本相反,但同样需要先确定有效的冗余位,即包含数字水印信息的冗余位。然后逐一扫描,获取该冗余位的值。得到冗余位的值之后,为防止网络攻击和可能的数据损坏,需要先对值进行有效性判断,以确保数值为于水印算法可以处理的值范围内。如果不满判断要求,可以认为该数据包内的水印算法已被破坏,于是不再进行下一步处理,直接将该包交给解码器。如果数值正确,则对其进行简单的解密处理,还原成为真实的数字水印信息。
提取出来的数字水印信息暂时存放在内存中,根据客户端设置的不同,可以选择将其直接以明文的方式在屏幕窗口上输出,也可以以写磁盘日志文件的方式保存至指定的目录下,供后续处理使用。
3)视频解码模块的解码器使用符合ISO标准的MPEG4解码器,对纯视频数据包进行解码,将其还原成为最原始的图像序列;
4)视频播放模块使用解码后得到的图像序列,通过窗口显示的方式将最初的视频内容播放出来,供用户欣赏。该模块根据图像的大小自动调整播放窗口的大小。该模块还可以根据用户的设置调节播放窗口的画面参数,如亮度和对比度等,直接影响用户的视觉感觉。该模块还可以包括一些流媒体视频播放所需的控制开关,如“连接”、“播放”、“暂停”、“停止”、“静音”、“音量调节”等。
整个客户端使用了开源软件MPEG4IP,使用了其提供的MP4Player作为默认的解码器和播放器。本发明的客户端的所有代码修改,都是在MPEG4IP的基础上完成的。