H.264视频回放(精选7篇)
H.264视频回放 篇1
H.264/AVC[1]是ISO/IEC MPEG 和ITU-T VCEG 联合制定的最新的视频编码标准。在同等还原图像质量条件下,与H.263+和MPEG4相比,H.264能够节省一半的码率。H.264正以其高压缩率,优秀的图像质量,低时延以及网络友好等特点,已经得到越来越广的应用。然而Windows平台下用户最熟悉的媒体播放器Windows Media Player本身并不支持H.264编码格式的视频播放,而是需要另外安装H.264的解码插件。Windows平台下最普通的媒体文件容器格式莫过于ASF[2]和AVI。由于Windows Media Player的框架特性,使得编解码插件对视频编码格式的支持,还与文件容器相关。目前能支持AVI容器中的H.264编码格式视频播放的免费的插件有ffdshow和CoreAVC等,但能够配合Windows Media Player支持ASF容器中的H.264编码格式视频的播放的免费插件则没有。ASF容器格式是Windows平台下非常流行的一种适合流媒体传输的容器格式,因此编写支持ASF容器中的H.264编码格式视频播放的媒体插件,对于应用来讲非常有必要。
在Windows平台的流媒体系统中,由于Windows Media Player与Windows操作系统捆绑以及Windows操作系统的普及程度,依赖Windows Media Player作为媒体系统的客户端呈现给用户可以使得用户友好性得到增强,也可以节省开发新媒体播放器的成本,所以很多应用于Windows平台下的流媒体系统都是利用Windows Media Player作为媒体系统的终端。要使得以Windows Media Player作为客户端的ASF流媒体系统能够采用H.264编码视频格式,就必须要有支持ASF容器中H.264视频播放的插件。通过探索,作者寻找到一种利用FFMPEG,对其进行DMO[3]封装实现配合Windows Media Player支持H.264视频播放的插件的方法。
1 H.264简介
H.264是国际标准化组织(ISO)和国际电信联盟(ITU)共同提出的继MPEG4之后的新一代数字视频压缩格式,它即保留了以往压缩技术的优点和精华又具有其他压缩技术无法比拟的许多优点。
(1) 低码流(Low Bit Rate):
和MPEG2和MPEG4 ASP等压缩技术相比,在同等图像质量下,采用H.264技术压缩后的数据量只有MPEG2的1/8,MPEG4的1/3;显然,H.264压缩技术的采用可以大大节省用户的下载时间和数据流量收费。
(2) 高质量的图像:
H.264能提供连续、流畅的高质量图像(DVD质量);
(3) 容错能力强:
H.264提供了解决在不稳定网络环境下容易发生的丢包等错误的必要工具;
(4) 网络适应性强:
H.264提供了网络适应层(Network Adaptation Layer), 使得H.264的文件能容易地在不同网络上传输(例如互联网,CDMA,GPRS,WCDMA,CDMA2000等);
H.264标准还在不断发展,SVC(scalable video coding)[4]和MVC(multi-view coding)[5]添加作为H.264的修正的标准化工作正在进行中,因此H.264的功能将更加丰富,适用更多应用场景。我们有理由相信,H.264标准将会受到业界的广泛应用,因此实现支持H.264播放的插件对Windows平台流媒体应用非常有意义。
2 DMO介绍及应用
在Windows 媒体应用中,主要包括DirectShow[3]和DMO。DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布,为多媒体流的捕捉和回放提供了强有力的支持。
DirectX媒体对象(DirectX Media Objects,简称DMOs),是微软提供的另一种流数据处理COM组件,与DirectShow filter相比,DMO有以下优点:
(1) DMO比filter实现的功能要少很多,这使得DMO“体积”很小;
(2) DMO使用起来比filter更有灵活性。DMO的使用不需要filter graph,应用程序可以直接与DMO交互。而DMO也可以通过一个DMO wrapper filter工作于 DirectShow环境。
(3) DMO总是同步处理数据,不像filter有独立的数据传送线程,需要考虑多线程编程问题;
(4) 与传统的编解码管理器ACM、VCM相比,用DMO开发的编解码器是基于COM的,更易于扩展。并且DMO支持多个输入和多个输出;
(5) DMO不需要像filter一样分配数据传送的内存,而有DMO的使用者负责;
(6) DMO是一个独立功能模块,不需要像filter一样连接成一条链路;
(7) DMO不需要像filter一样将数据“推”下去,数据的输入输出都是由DMO的使用者完成的;
所有这些优点,使得DMO成为微软对于Encoder和Decoder开发的重点推荐模式。DirectX 9.0 SDK中,微软更是把DMO从DirectShow中分离出来,而对于一些transform filter,微软也推荐用DMO的方式来替换。因此,本文选择用DMO来封装H.264视频解码插件。
3 FFMPEG
FFMPEG是一套完整的录制,转换和流化音频和视频的开放源代码的解决方案,其包括以下几部分组成:
(1) libavcodec,一个包含了所有FFmpeg音视频编解码器的库.为了保证最优性能和高可复用性,大多数编解码器从头开发的。
(2) libavformat,一个包含了所有的普通音视格式的解析器和产生器的库,该库里边包含解码H.264的codec。
(3) ffplay,用 SDL和FFmpeg库开发的一个简单的媒体播放器。
(4) ffserver,基于HTTP用于实时广播的多媒体服务器。
(5) ffmpeg,视频文件转换命令行工具,也支持经过实时电视卡抓取和编码成视频文件。
FFMPEG是基于linux平台上开发的,想要移植到VC平台上需要进行很大的改动,比较困难。幸好在Windows平台下可以利用MinGW 编译FFMPEG代码,生成avformat.dll, avcodec.dll , avutil.dll三个动态连接库,可供应用程序使用。FFMPEG的高性能设计,以及其包含的经过了优化的H.264解码算法,使得FFMPEG解码H.264视频的速度相当快;在H.264开源解码器评测中,FFMPEG的解码速度最快。因此利用FFMPEG实现播放插件,解码速度快,占用内存小。
4 代码实现
代码实现的主要任务是将FFMPEG封装在DMO对象中,由DMO对象与Windows Media Player协商媒体类型、对象连接以及传递媒体数据,而FFMPEG负责将输入到DMO中的未解码的H.264视频帧解码成可以显示的RGB格式的视频帧,然后交由DMO输出端传送予Windows Media Player进行显示。
在微软的DirectX SDK中,为开发DMO提供了一个IMediaObjectImpl模板类,使得开发DMO比较容易。 实现程序定制的DMO,只需派生此模板类,实现17个以Internal开头的函数。
4.1 FFMPEG库的使用
使用FFMPEG库,首先应该将avcodec.dll,avformat.dll,
avutil.dll加入到工程中,并且在文件头中需要包含avcodec.h头文件;
另外使用FFMPEG库的函数之前,需要对FFMPEG库进行初始化,因此本实现中是在DMO对象的构造函数中实现FFMPEG库的初始化。通常的操作是通过avcodec_init()以及avcodec_register_all()初始化并注册FFMPEG所有的编码解码器;然后通过CODEC_ID_H264指示码寻找到本DMO使用的H.264解码器,即:
codec = avcodec_find_decoder(CODEC_ID_H264).
然后做编解码器上下文初始化及申请空间保存解码图像,即:c= avcodec_alloc_context();
picture= avcodec_alloc_frame();
最后是根据得到的H.264 codec以及解码上下文结构去打开H.264解码器,使其能够工作,即:
avcodec_open(c, codec);
具体代码可以参照ffmpeg源代码中的output_example.c中的示例代码。
4.2 InternalCheckInputType函数
该函数的主要目的是检查DMO对象是否适合于此输入的媒体类型的解码,如果检查通过那么该DMO才可以用于此种类型视频的解码。本设计的DMO中实现的是H.264视频解码插件,因此DMO接收的输入媒体主类型是视频,而媒体subtype则是H.264格式;所以只有当媒体类型符合此限制时,函数返回TRUE,检查通过。
4.3 InternalCheckOutputType函数
该函数的目的是检查DMO对象是否能够产生此种媒体类型的视频输出,如果检查通过那么该DMO才可以用于产生此类视频输出。解码器的目的就是将压缩的格式解码,成为无压缩可以直接显示的格式;在这里,我们选择最普通的RGB24格式。
4.4 InternalProcessInput函数
该函数的作用是输入一个未解码的图像帧,需要做的工作就是把帧对象保存,以待应用程序在DMO输出端请求图像输出时,对此输入图像帧执行解码操作,属出解码图像。因为图像帧在图像中是通过C++的COM对象IMediaBuffer来保存的,因此我们只需要IMediaBuffer的接口函数GetBufferAndLength得到输入的图像存放的内存块指针和大小,然后增加COM对象的引用计数,最后设置相关的时间戳即可。
4.5 InternalProcessOutput函数
该函数的作用是将上次输入DMO的未解码的帧调用FFMPEG中的解码 函数进行解码,输入YUV格式的视频,然而我们最终要求输出的视频格式是RGB格式的,因此还必须将YUV格式的视频转换成RGB格式的视频。幸好的是FFMPEG中有高度优化的函数YUV2RGB供我们使用。使用本DMO的应用程序会向本函数请求输出解码图像,因此在这里我们调用FFMPEG中的解码函数对输入图像进行解码,把解码重建后的图像输出,交由应用程序进行播放。具体的代码如下:
len = avcodec_decode_video(c, picture, &got_picture,outbuf_ptr, size);//调用FFMPEG媒体库的解码函数进行解码
YUV2RGB(picture->data[0],picture->data[1],picture->data[2],pOutData,pic_width,pic_height); //调用FFMPEG媒体库的格式转换函数将YUV格式视频转换成RGB格式
4.6 DMO注册函数
Windows Media Player播放视音频时,会根据视音频的格式到系统注册表中寻找到相应的解码器,如果找不到合适的解码器,Windows Media Player则播放不正常甚至无法播放。所以DMO程序需要在系统中进行注册,而DMO本身是一个COM程序,COM程序的注册在DllRegisterServer中进行。因此在DllRegisterServer函数中通过接口函数DMORegister在操作系统注册表中注册本DMO的信息。设置DMO的信息为只有一个输入端,输入的是H.264格式的视频;设置DMO的信息为只有一个输出端,输出的是RGB格式的视频。如此设置以后,当Windows Media Player播放ASF中的H.264视频时可以顺利地寻找到本插件,成功播放ASF容器中H.264格式的视频。
//定义输入媒体格式
DMO_PARTIAL_MEDIATYPE mt_input;
mt_input.type=MEDIATYPE_Video;
mt_input.subtype=MEDIASUBTYPE_H264;
//定义输出媒体格式
DMO_PARTIAL_MEDIATYPE mt_output; mt_output.type=MEDIATYPE_Video;
mt_output.subtype=MEDIASUBTYPE_RGB24;
DMORegister(L“DMO Sample”, //DMO对象名
CLSID_Sample, //DMO对象的序列ID DMOCATEGORY_VIDEO_DECODER, //视频解码器目录
0,
1, //输入媒体类型个数
&mt_input, //输入媒体类型格式
1, //输出媒体类型个数
&mt_output); //输出媒体类型格式
到此,利用FFMPEG封装在DMO对象中构造一个能支持Windows Media Player播放ASF容器中的H.264视频播放插件所需要做的工作已经完成。
5 结束语
鉴于目前缺乏配合Windows Media Player播放ASF媒体容器格式的H.264视频播放的免费插件,本文介绍了一种简单实现此插件的方法,依赖于DMO高效性以及FFMPEG编解码库中性能优化的H.264解码算法,使得插件解码速度快,内存损耗小。利用此插件,Windows平台上的H.264流媒体系统可以利用Windows Media Player作为媒体系统的客户端,节省开发新播放器的成本,大大增强了系统的用户友好性。
参考文献
[1]Draft ITU-T recommendation and final draft international standard of joint video specification(ITU-T Rec.H.264/ISO/IEC14496-10AVC)in Joint Video Team(JVT)of ISO/IEC MPEG and ITU-TVCEG,JVTG050,2003.
[2]Microsoft Corporation.Adranced Sytems Format(ASF)Specifrcation,Revision01.20.03,December2004[5].
[3]陆其明.Drrectshow开发指南.北京:清华大学出版社,2003.
[4]T.Wiegand,G.J.Skuivan,J.Reichel,H.Schwarz ancl M.wien,eds.Jornt Draft7,Joint Video Team.Doc.JVT-T201,Klagenfurt,Austria,July2006.
[5]Jornt Drafe6.0on Multview Video Coding.JDT-z209,Antalya,Turkey,Tan2007.
H.264视频编码标准学习工具 篇2
近年来, 随着流媒体技术、网络技术, 特别是多媒体技术和计算机技术的迅猛发展, 视频信息在人们的日常生活中占据的比重越来越大。新一代视频编码标准H.264已经发布, 就在视频编码领域得到的广泛关注。但是在很长一段时间中, 视频编码技术被认为只被视频编码研究领域的专家和学者所知。究其原因, 主要是因为视频编码技术所涉及的学科知识纷繁复杂, 研究者需要有丰富的图像处理知识和编码知识, 同时还需要学习JVT提供的带有源代码的参考软件。学者需要在读懂代码的基础上, 根据自己的理论研究成果修改源代码, 以进行实验, 验证学者提出或改进标准后编码算法的性能。而在实际实验中, 学习H.264视频编码标准的相关工具软件也不为一般学生所熟知, 这为研究者的实验带来了较多困难。本文将介绍四种学习H.264编码标准的必备软件。
1 代码阅读工具———source insight
众所周知, 在阅读代码时, 研究者需要经常查看变量、函数、宏等符号的定义、定义位置, 或者这些符号调用了何种符号或何处调用了这些符号。source insight就很好的展现了它在阅读代码方面的优越性。source insight是一个代码编辑器, 学者可以直接在source insight中修改需要修改的参考软件的部分代码。同时, source insight也是一个代码分析器, 在编辑源代码时, source insight会在后台动态维护符号数据库, 通过这个符号数据库, 就可以实现查找、替换符号, 跳转到符号定义处或者被引用处, 检查符号拼写、符号匹配的在常用编译软件中难以实现的功能。
source insight界面操作很简单, 不同种类的符号被赋予了不同的大小、图形和颜色, 比如数字赋为红色, 关键字赋为绿色, 注释赋为蓝色, 变量名函数名赋为蓝黑色, “#”号是包含的头文件, 中间带着写有M的绿框代表宏定义绿色椭圆代表全局变量等。这种区分能够让读者一目了然, 特别是将鼠标移到一个符号时, 界面的左下角的上下文窗口“context”会显示该符号的定义处, 单击定义处, 代码就会自动跳转到该处。source insight也不会简单的记录或者跟踪符号, source insight可以在“references”窗口和“calls”窗口分别显示索引关系树和调用关系树。从这两个窗口中, 学者可以清晰、有层次、有目的的阅读代码。
source insight最重要的、最常用的功能就是查找“lookup references”, 该功能会把该符号在代码中出现过的所有的位置以列表的形式向用户给出。在查找时, 可以设置查找的条件, 比如“case sensitive”代表是否区分大小写, “whole words only”代表是否只搜索整个字符串或者包含该字符串, “skip inactive codes”代表是否跳过无用代码, “skip comments”代表是否跳过注释等。
2 分析代码结构工具———doxygen
doxygen软件是一个强大, 使用方便且支持各种操作系统和编程语言的代码文档生成系统。doxygen是荷兰人Dimitri van Heesch开发, 在GNU公共许可证 (GPL) 下发布。最初, doxygen在linux下开发, 但现在已经被移植到多种操作系统平台下, 包括unix各种版本, MSWindows和Mac OS。
在学习H.264代码时, 可以用doxygen生成代码手册来辅助阅读H.264代码, 以增加对H.264代码整体框架的把握和加深数据流向的认识。在程序注释时, 只要按照一定的规范书写, 就能利用doxygen把注释和其它重要信息一并转换为说明文件, 保存为HTML、CHM或者PDF等格式的文档。利用doxygen生成的代码可以将针对函数或数据类别说明的注释形式化, 因此, 使用doxygen生成代码手册可以在相当程度上减少代码阅读负担。
3 方便的H.264播放与分析工具———elecard stream Eye tools
elecard stream Eye tools包括五个工具:elecard YUV Viewer、elecard Stream Eye、elecard stream Analyzer、elecard Buffer Analyzer和elecard Video Quality Estimator。
elecard YUV Viewer工具使用最多。elecard YUV Viewer能够查看视频文件的YUV数据序列, 可以将文件互相比较, 以找出YUV图像的差别。该软件还允许用户计算PSNR、NQI、VQM等视频质量评估指标。elecard YUV Viewer支持多种YUV格式, 如IYUV、YV12、YV16、UYVY等。
elecard stream Eye是用来查看视频码流的工具, 支持对MPEG-1、MPEG-2、MPEG-4和H.264格式。当利用更改H.264参考软件代码编码测试视频后, 就可以利用elecard stream Eye分析输出的H.264格式视频, 从而从结果分析中显示研究者改进算法的性能。elecard stream Eye可以播放H.264码流, 查看码流的平均值、峰值和最小值。同时, 该软件还可以查看片分割, 宏块类型、分割模式, 运动矢量大小, 运动矢量方向, 以及各种头信息。elecard stream Eye还提供了视频截图功能, 这点在研究者撰写论文时很重要。研究者可以利用elecard stream Eye对编码输出的H.264格式视频截图, 并与利用elecard YUV Viewer对所编码的YUV格式的原视频的截图进行对比, 以此说明采用研究者改进算法后的输出视频和原视频在视觉上的差异。
由于有了强大的H264visa软件, elecard stream Analyzer很少使用。elecard Buffer Analyzer是用来分析解码器缓冲区参数的软件, H.264研究者很少会使用。elecard Video Quality Estimator则是提供了更多的用于质量评估的指标, 除非进行专门的质量优化, 一般很少用到。因此, elecard stream Analyzer、elecard Buffer Analyzer和elecard Video Quality Estimator这三款工具软件的使用不是很多。
4 H.264码流分析利器———H264visa
H264visa是一款功能更加强大的码流分析工具, 该软件可以支持H.264字节流格式、RTP格式以及其它一些H.264码流的封装格式。
RTP协议 (real time transport protocol, 实时传输协议) 是用于internet上多媒体数据流的一种传输协议, H.264码流数据需要按照RTP协议打包后在internet传输。对于研究H.264视频编码标准的研究者来说, 需要分析的是H.264码流数据。H264visa除了包含elecard stream Eye tools能够提供的所有功能外, 还具有很多特性:
(1) 显示宏块编码数据, 预测块数据, 残差数据和变换系数;
(2) 可以同时打开原始YUV文件和H.264输出文件, 可同时显示原始文件与编解码后重建视频文件的差异, 并计算PSNR;
(3) 显示详细的宏块类型统计数据、宏块预测信息、边界强度信息和包含NAL的头信息等;
(4) 可以显示预测图像、残差图像、块效应滤波前图像;
(5) 可以直接打开加了封装的视频, 例如FLV、MP4等, 还可以分析封装可以, 对于学习视频封装格式也有很大帮助。
5 结论
随着视频编码技术的迅猛发展, 越来越多的学者将会从事视频编码领域的研究, 学习好代码阅读工具———source insight、分析代码结构工具———doxygen、方便的H.264播放与分析工具———elecard stream Eye tools、H.264码流分析利器———H264visa四款工具将提高研究人员的工作效率。
摘要:H.264视频编码标准发布后得到的广泛关注, 但是由于H.264代码量巨大, 给研究者带来了较多困难。本文介绍了四款H.264视频编码标准的学习工具软件, 以方便广大学者对于H.264编码标准的学习。
关键词:H.264,代码阅读,码流分析
参考文献
[1]陈靖, 刘京.深入理解视频编解码技术:基于H.264/AVC标准及参考模型[M].北京:北京航空航天大学出版社, 2012.
H.264视频回放 篇3
关键词:H.264,视频水印技术,帧间预测,鲁棒性
随着网络和多媒体技术的发展, 数字视频[1]的应用越来越广泛, 视频作品遭到恶意攻击和非法侵权的问题也越来越严重。如何有效地对数字视频进行版权保护, 成为多媒体技术发展中迫切的现实问题。视频水印技术正是为解决这个问题而受到人们越来越多的关注, 成为当前学术领域研究的热点。H.264作为最新一代的视频编码标准, 迫切要求水印技术与其相融合, 提升和改进现有的视频水印算法, 以适应新的应用环境。
在对视频水印技术及H.264标准分析研究的基础上, 研究了一种针对H.264编码的鲁棒视频水印设计算法。
2 算法描述
该算法首先将二值水印图像扫描为序列[2], 然后在H.264帧间预测编码阶段根据水印序列选择不同的区块划分范围, H.264中帧间预测块的划分方式有4种, 分别是16×16、两个16×8、两个8×16、四个8×8[3], 其运动补偿也相应地有四种。在进行帧间预测时, 本算法首先跳过对16×8区块的预测, 如果预测算法所决定的区块划分大小为16×16, 算法将根据水印比特序列中的不同值决定是否将此16×16的区块划分成16×8的区块;如果预测算法所决定的区块划分大小不是16×16, 则直接进行熵编码和码流生成。此算法如图1所示。
2 算法实施步骤
2.1 水印图像二值化
水印图像先行进行二值处理[4], 使水印图像的数据中只包含0和1两种, 以方便进行嵌入处理。为了得到理想的二值图像, 一般采用封闭、连通的边界定义不交叠的区域。所有灰度大于或等于阈值的像素被判定为属于特定物体, 其灰度值以255表示, 否则这些像素点被排除在物体区域以外, 灰度值为0, 表示背景或者例外的物体区域。如果某特定物体在内部有均匀一致的灰度值, 并且某处在一个具有其他等级灰度值的均匀背景下, 使用阈值法就可以得到比较好分割效果。如果物体同背景的差别表现不在灰度值上 (比如纹理不同) , 可以将这个差别特征转换为灰度的差别, 然后利用阈值选取技术来分割该图像。动态调节阈值实现图像的二值化可动态观察其分割图像的具体结果。其二值化处理的流程图如图2。
所采用的水印图像如图3
图3 (a) 中的图像经过二值变换后得到的16进制代码如下。
2.2 水印图像的Arnold置乱
Arnold置乱[5]是V.J.Arnold在遍历理论研究中提出的一种变换, 俗称猫脸变换, 其原意为 cat mapping。目前, Arnold变换多作为数字图像置乱的一种技巧。Arnold变换公式如下[1,2]:
置乱操作在MATLAB中实现。
Arnold变换具有周期性, 而且周期就是迭代到某一步时, 将重新得到原始图像的迭代次数。Dyson和Falk给出了离散Arnold变换的周期性, 对任意的N (N>2) , Arnold变换的周期为TN≤N2/2。图3 (b) 经过Arnold置乱后得到的图像如图4。
2.3 水印嵌入
算法通过在编码模式上的强行选择来进行信息的隐藏, 具体的实现如图5所示。
嵌入水印前, 残差帧宏块划分如图6。
可以发现在残差帧中图像变化平坦的区域, 宏块的选择都是16×16, 在嵌入水印后可以发现部分宏块被划分成了更小的块 (图7) , 这种嵌入算法对视频效果的影响可以忽略, 因为此算法不会修改任何帧像素的值, 可以达到更高的保真度。
图 (7) 中用粗线条框住的就是嵌入水印的位置, 按照上图所示, 嵌入的数据为:01010101100000000000000101。
根据上例, 定义水印与宏块划分的关系如下
3.4 水印提取
根据H.264压缩编码的语法标准[8], 16×16宏块在I片、P片、B片中都存在, 但是本算法使用到的16×16宏块, 仅仅为帧间预测中的16×16宏块, 所以在提取水印时首先要跳过对I片中宏块的检测, 然后对B片和P片中的16×16宏块及16×8宏块进行检测, 并得出水印序列 (图8) 。
4 实验结果
本算法的实施环境为:CPU:奔腾E2160, 内存:3 G。为了对算法进行仿真和性能测试, 采用C语言和Matlab语言结合编程的方式, 运用VisualC-6.0和Matlab R2009a的编程平台, 对算法进行了程序上的实现。其中对水印图像的预处理方面由Matlab语言实现, 并将处理后的水印序列保存在一个图像文件中, 以便用C语言进行水印的嵌入。同样, 在水印提取时是将提取出的水印序列保存在一个图像文件中, 然后用Matlab语言对其进行后期处理, 并恢复为水印图像。H.264编解码模型采用的是H.264官方的参考软件JM86版, 实验所用QP=28[6]。
实验所用视频序列为标准视频序列, 如表1所示。
算法在JM代码中实现, 嵌入水印在encode_one_macroblock () 函数中实现, 提取水印在read_one_macroblock () 函数中实现, 水印添加后的码率的变化情况如表2。可以看到水印前后码率的变化并不大, 冗余率 ( (含水印视频码率一原视频码率) /原视频码率) 为2.4%~0.16%, 在保证图像清晰度的条件下可以忽略, 满足码率稳定的要求。
根据表3数据显示, I片的数据量在嵌入水印前后没有变化, B片的数据量在嵌入水印后变化较大, 例如在foreman视频中B片的数据量较大, 嵌入水印后所产生的冗余度在三次实验中也是最大的, 而P片在承担了大量的水印嵌入数据时也不会产生大量的冗余数据, 所以本算法在B片少量出现的情况下可以达到最佳的效果。
4.1 水印不可见性
不可见性[7]主要有主观和客观之分。主观性主要根据个人对视频图像的观察来判定, 效果如表4所示。
用客观数据PSNR[8]作为客观评价的标准, 图9是利用水印图像b经过置乱后嵌入akiyo视频素材, 提取后的PSNR值的对比情况。
从图9可以看出PSNR值的变化非常小, 基本上在0.1以内。说明本算法对图像质量的影响非常小。
水印的提取情况如表5。
4.2 抗噪声攻击
噪声攻击[9]是常见的数字水印攻击方式, 但噪声攻击的对象一般为视频中的亮度或者色彩分量, 本算法的水印嵌入位于控制域, 加入噪声攻击无法对其水印信息造成破坏。
4.3 帧截取攻击
由于H.264视频压缩标准中帧截取的攻击实现非常困难, 本次攻击采用的是在提取水印时放弃第二帧的水印信息提取, 攻击后水印图像的情况如表7。
总结:通过以上几种攻击方式可以看出:控制域水印嵌入对噪声攻击等面向图像的攻击手段不敏感, 但是在帧截取的攻击下对水印图像造成了一定的破坏。
4.4 实时性分析
实时性分析主要是针对编解码的时间是否增加, 对程序的实时性的测试, 本算法主要在帧间预测阶段实现水印嵌入, 对编码的时间影响非常小, 甚至能减少编码时间, 提高编码算法的实时性, 现将实验时各帧编码时所花费的时间进行对比, 就能分析出本算法对编码时间的影响。
表8是嵌入水印前后时间的比较, 可以看出, 由于水印算法跳过了对16×8模式的运算, 在大多数帧的编码时间比原编码程序的时间要短, 这说明了本算法在实时性上是明显的。
5 结束语
数字视频水印有健壮性、透明性、盲检测等基本要求, 如何使水印嵌入算法既有较好的透明性又能抵抗有意或无意的攻击, 是数字视频水印研究的主要课题之一。
探讨的主要是基于H.264标准的鲁棒视频水印技术, 主要工作如下。
1) 本算法对视频图像中的图像数据不做任何修改, 只针对宏块的划分模式做修改, 所以本水印算法对视频图像的质量没有影响, 只需要考虑压缩算法对图像的影响。
2) 本算法的水印提取算法相对简单, 有利于实时实现。
视频水印技术研究涉及众多科学领域, 内容繁多, 成熟实用的水印算法设计仍有较大的难度, 而H.264编解码过程又较为复杂, 更优的算法现仍在研究之中。
参考文献
[1]唐松生, 董颖.数字视频水印技术综述.计算机安全, 2007; (9) :31—33
[2]王向阳, 杨红颖, 赵红.一种新的自适应量化数字音频水印算法.声学技术, 2004;3:117—120
[3]毕厚杰, 新一代视频压缩编码标准H.264/AVC.北京:人民邮电出版社, 2005:84—91
[4]吴锐, 黄剑华, 唐降龙, 等.基于硬度直方图谱象类的文本图像二值化方法, 电子与信息学报, 2009; (10) :2460—2464
[5]冯茂岩, 冯波, 浓春林.基于分块DCT变换和Awod置乱的自适应图像水印算法.计算机应用, 2008; (1) :171—173
[6]余小军, 英玮, 范科峰, 等.一种抚H.264压缩的低比特率视频水印算法.计算机工程, 2008; (2) :171—173
[7]钟伟, 马希俊, 余松煌.一种使用Legendre阵列的图像水印.通信学报, 2001;22 (1) :1—63
[8]郑振东, 王沛, 陈胜.基于运动矢量区域特征的视频水印方案.中国图象图形学报2008, 10 (13) :1926—1929
[9]单承赣, 孙德辉.基于H.264/AVC低比特率视频流的双水印算法.计算机应用, 2007;27 (8) :1922—1925
H.264视频回放 篇4
目前,基于H. 264 的压缩域视频水印的研究主要分为两类: 1) 在运动矢量中嵌入水印,这类算法大多是在P帧的运动矢量中嵌入,适合视频内容的完整性认证的目的,属于脆弱型水印,但是这类算法嵌入水印的容量很小。2) 在量化的DCT( Discrete Cosine Transform) 系数中嵌入水印,这类水印又分为两类: ( 1) 嵌入水印的系数参与编码端像素的重建过程,这类算法在压缩的过程中嵌入水印可以减小误差漂移,但是需要解码和重编码; ( 2) 在压缩后的码流中嵌入水印,这类算法只需对压缩码流进行部分解码,不需要完全解码,从而大大的降低了运算速度,但该类算法会引起误差漂移,且对视频质量的影响较大。
为了同时达到版权保护和内容认证的目的,文献[5]提出一种基于H. 264 的混合视频水印方案,将脆弱型水印嵌入运动矢量中,将鲁棒型水印嵌入量化DCT系数中。该方案通过实验证明对角线位置的系数比其他位置的系数更加稳定,因此将鲁棒性水印嵌入在对角线位置的一个高频系数中。文献[6]提出一种基于H. 264 的CAVLC( Context-Adaptive Variable Length Coding) 域的盲视频水印算法,该方案在宏块中选择一个4 × 4 亮度子块,然后将水印信息嵌入I帧除拖尾系数以外的最后一个非零量化AC系数中。文献[7]提出一种基于H. 264 的鲁棒型视频水印,该方案首先选择一个4 × 4 子块,然后将水印信息嵌入到对角线区域的一个中频系数中。文献[8]提出一种基于VLC ( Variable Length Coding) 域的H. 264 / AVC( Advanced Video Coding) 视频流内容级认证水印算法,该方案通过统计宏块中4 个8 × 8 子块中拖尾系数的个数,并筛选出拖尾系数最多的两个8 × 8 块,然后根据阈值调制两组8 × 8 块的拖尾系数的关系以达到嵌入水印的目的。文献[9]提出一种基于脆弱水印的H. 264 视频完整性认证方案,该方案选择在某个4 × 4 块的Z扫描序号为11~15 的系数根据奇偶性嵌入水印。为了保证码流的稳定性和水印的有效性,只是在非零的高频系数中嵌入水印。文献[10]提出一种基于纹理特征的H. 264 /AVC顽健视频水印算法,该方案利用人眼的视觉特性及Weber定律对当前宏块的16 个4 × 4 块进行纹理块判断,根据纹理块分类来决定水印信息的强度,采用能量差的方式对固定位置的量化AC系数进行微调以达到水印嵌入的目的。以上算法存在如下问题: 将水印嵌入一个或者多个确定位置的系数中或者是具有某个特征的系数中。这类算法安全性较低,表现在一是很容易在D/A变换、视频格式转换、空间分辨率的切换等常见的无恶意攻击中丢失水印,二是很容易被攻击者进行篡改而导致提取的水印无法识别。
基于H. 264 压缩域视频水印的已有研究大多是考虑水印的鲁棒性和透明性,却很少考虑到水印的安全性[11-14]。数字视频水印一般需要在鲁棒性、透明性和安全性之间达到一定的平衡。关于鲁棒性视频水印一般是选择在固定的位置或具有某个特征的位置嵌入水印,很容易被攻击者进行篡改而导致水印的安全性较差。针对这个问题,本文提出了一种H. 264压缩域安全型视频水印。为保证水印方案的鲁棒性,本文选择纹理复杂的4 × 4 预测模式( Intra_4 × 4) 的宏块,并根据Canny算子选出Intra_4 × 4 宏块中纹理更加复杂的嵌入宏块。为了保证算法的安全性,本文根据混沌序列对宏块内的4 × 4 子块进行分组,这样攻击者在不能确定分组的情况下,无法通过对视频信号进行大量修改,且不影响视频质量的前提下,去除水印或者是使提取的水印达到无法识别的目的。
1 安全型视频水印算法
近年来,结合H. 264 压缩编码标准的鲁棒性视频水印算法,大都选择将水印嵌入I帧亮度块的Intra_4 × 4 宏块中。H. 264 的帧内亮度块的编码技术主要采用了Intra_4 × 4 预测模式和Intra_16 × 16 预测模式,文献[10]提出H. 264 在编码视频帧时,对于纹理比较复杂的宏块大部分都选择Intra_4 ×4 预测模式进行编码。因此本文选取Intra_4 × 4 预测模式的宏块作为待嵌入域。
1. 1 嵌入宏块的选取
已有研究根据人类视觉系统HVS ( Human Vision System) 特性证明人眼对于纹理复杂宏块的敏感度比纹理简单宏块的敏感度低。本文采用Canny算子选取Intra_4 × 4 中纹理更加复杂的宏块。其中Canny算子判断视频帧中宏块纹理复杂度的基本原理如下:
1) 对视频帧进行一阶和二阶求导,然而导数的计算对噪声比较敏感。所以先用高斯滤波器来对视频帧进行滤波。
高斯滤波函数如下
经高斯滤波后的视频帧如下
式中: f( x,y) 为原始视频帧; h( x,y,Δ) 为高斯滤波函数; g( x,y) 为滤波后视频帧; x、y是像素在图像中的位置; Δ 是滤波函数的参数。
2) 求g( x,y) 的梯度
g( x,y) 的梯度大小如下
g( x,y) 的梯度方向如下
式中: Gx( x,y) 是g( x,y) 在x方向的导数; Gy( x,y) 是g( x,y)在y方向的导数; ø( x,y) 为梯度的幅值; θ 为梯度的方向。
3) 根据梯度方向抑制梯度幅值的非极大值点。
4) 采用双阈值法抑制视频帧中的虚假边缘。通过阈值t1和t2来抑制图像的非极大值,从而得到梯度值小于阈值的图像。使用阈值很高的图像得到的假边缘少,但此时的图像边缘有不连接的情况,再用阈值小的图像来弥补,从而得到完整的边缘图像,然后根据图像的边缘特征判断宏块的纹理复杂度。
1. 2 安全型算法基本原理
为了提高鲁棒性视频水印的安全性,本文采用混沌序列对子块的分组进行置乱以增加攻击者对水印信息进行篡改的难度。根据H. 264 编解码标准以及JM8. 6 对宏块中16 个4 × 4子块的处理顺序来对子块进行标记,如图1 所示。
本文采用Logistic映射的混沌序列对子块进行分组,其定义如下
式中: u是控制参数,u∈[0,4]; xk是混沌值,xk∈[0,1]。混沌序列对初值x0非常敏感,也就是说,在非常近似的初值条件下,混沌序列在进行一定次数的运算之后所产生的序列也是截然不同的,从而保证了水印算法的安全性。为了获得1~16之间的整数序列T,本文需要对混沌序列进行求模运算,公式如下
式中: a,b是参数; T是求模之后的混沌值,T∈[1,16]。
相对于JPEG和MPEG-2 编码标准,H. 264 采用了先进的帧内预测编码技术,有效的减小了视频文件的空间冗余,从而达到了一个很好的压缩率。在H. 264 的编码过程中,将预测值与原始值相减得到的差值在经过DCT变换、量化和熵编码等操作后,大部分的差值都变成了0。文献[15]提出将水印信息嵌入在非零系数中可以有效的降低比特率的增加,为了保证稳定的视频比特流,本文选择在非零的量化系数中嵌入水印。本文根据H. 264 编解码的特性对量化后的4 × 4 块DCT系数进行标记,如图2 所示,并在5~9 和10~15 中分别自适应的选择一个非零系数作为水印的嵌入位置。
本文采用混沌序列对子块分组进行置乱,将满足条件的前8个子块子块分成2 组,每组包含4 个子块,混沌分组步骤如下:
1) 利用Logistic混沌对初值敏感的特性,生成一个长度为16 的一维序列,记为H,H∈[1,16]。
2) 按照图1 的顺序对宏块中的16 个4 × 4 子块进行标记,结合视频帧的边缘特征和宏块的编码模式,产生一个16位的0、1 序列,记为R。
3) 将1) 得到的序列H和2) 得到的序列R进行相与运算得到序列G,并将序列G作为秘钥。
4) 根据序列G将宏块中的16 个4 × 4 子块分成2 组,每组由4 个4 × 4 子块组成。
1. 3 水印的嵌入算法
本文的算法在H. 264 的编码过程中,根据待嵌入的水印信息和分组子块能量差之间的阈值关系来嵌入水印,水印的具体嵌入过程如图3 所示。
水印的嵌入步骤如下:
1) 将大小为M × N的二维有意义的水印图像转换为一维的0、1 序列,记为W。
2) 根据宏块分组原则得到的序列G将宏块分成2 部分,分别记为G1和G2,每个部分包含4 个4 × 4 子块。
3) 计算每组子块的能量,4 × 4 子块的能量Ei计算如下
式中: x1,x2分别是当前4 × 4 子块中所选择的2 个量化系数;Ei代表分组后第i个子块的能量; i代表分组后子宏块标记顺序。
4)根据能量差嵌入水印,公式如下
式中: Tr是嵌入阈值; Eg1是第一组的能量; Eg2是第二组的能量; W是水印信息。
5) 当w = 1,而Eg1- Eg2< Tr时,需要增加Eg1或者减小Eg2的值来满足式( 10) 。先使G1组中4 个子块的系数值都增加1,若不满足式( 10) ,则使G2组中的4 个子块的系数值减小1,如此循环,直至满足式( 10) 。
6) 当w = 0,而Eg1- Eg2≥Tr时,需要增加Eg2或者减小Eg1的值来满足式( 10)。先使G2组中4个子块的系数值都增加1,若不满足式( 10) ,则使G1中的4 个子块的系数值减小1,如此循环,直至满足式( 10) 。
1. 4 水印的提取算法
本文的水印信息提取算法操作简洁、迅速,只需要解码出量化DCT系数就可以完成水印信息的提取,不需要对视频序列进行全部的解码,也不需要原始视频的参与。水印的提取过程如图4 所示。具体提取步骤如下:
1) 先对压缩过的视频序列进行熵解码,重排序,取出量化的DCT系数。
2) 根据秘钥G对宏块的子块进行选取。
3)计算每组的能量,并求出两组的能量差,记为Ed。
4)如果Ed≥0,则w=1;如果Ed<0,则w=0。
2 实验结果及分析
本文的水印嵌入和提取以及攻击实验是结合Open CV在H. 264 编解码标准的参考软件JM8. 6 的平台上进行的。本文的测试序列有Forman,City,Habour,Ice,Mobile,Soccer,参考软件JM8. 6 的参数配置以及所使用的视频类型如表1 所示。
2. 1 透明性实验
图5 是Forman和Habour视频序列的第一帧图像在水印嵌入前后的效果图,将原始的和嵌入水印之后的图像进行比较可以发现,嵌入水印后对视频造成的影响并不被人眼所感知,满足水印透明性的要求。主要是因为水印信息嵌入在Intra_4 × 4 预测模式中纹理复杂的宏块,通过对中高频系数进行微调以达到嵌入目的,而人眼对中高频的误差不敏感,这在一定程度上保证了水印的透明性。
图6 对Forman,City,Habour,Ice,Mobile,Soccer这6 种视频序列做了相应的测试,通过比较视频在嵌入水印前后的PSNR发现: 嵌入水印后,视频的PSNR有所减小,也就是说视频的质量实际上是有所下降,只是从主观上不易被人眼所察觉。图6 中的6 种视频测试序列,在嵌入水印后PSNR平均下降了0. 53 d B,从客观上保证了视频的质量。
2. 2 抗重编码实验
为了分析本文算法对重编码的抵抗能力,表2 选择了5种相同格式( CIF) 、相同大小( 176 × 144) 的测试视频Forman,City,Habour,Ice,Mobile,Soccer,在同一量化步长( QP = 28 ) 条件下对已嵌入水印的视频序列进行重编码处理,重编码后提取的水印图像如表2 所示。
通过比较表2 中6 种视频序列在遭受重编码的攻击下提取的水印图像,虽然有一些错误比特,但在没有原始水印图像的比对下还是可以清晰辨认,从而证明了水印算法具有抗重编码攻击能力。
2. 3 攻击性实验
本文通过对Forman视频序列进行测试,并比较文献[12]和文献[14]与本文算法的水印性能,比较结果如表3所示。
已有的基于H. 264 压缩域的鲁棒性实验一般是将水印嵌在量化后的DCT的一个系数上,本文通过混沌置乱对子块进行分组并将水印信息嵌入到多个系数中,这样大大地增加了水印的鲁棒性和安全性。
表3 通过 ρ 值来比较水印算法的性能,ρ 的计算公式如下
式中: Ns表示嵌入与提取水印图像中水印比特相同的个数;Na表示嵌入水印的总个数; ρ 表示提取水印的正确率,ρ 值越接近1,水印的鲁棒性越强,抗攻击能力越强。
由表3 可知,在相同测试条件下,本文嵌入水印后的PSNR相对于文献[14]来说增加了0. 07 d B,同时码率也增加了0. 27 kbit/s,但本文算法抗攻击的能力强于文献[14]。本文的算法与文献[12]相比,嵌入水印后PSNR减小了0. 04 d B,码率减小了0. 61 kbit / s,同时本文在遭受重编码、高斯低通、高斯噪声等攻击时提取出水印的性能优于也比文献[12]。由表3 可知,本文的算法抗循环滤波攻击的能力不如文献[14]和文献[12],但抗其他常见视频水印攻击的能力优于文献[14]和文献[12]。
3 结语
本文提出了一种H. 264 压缩域安全型视频水印算法,通过分析H. 264 的编解码特性,并结合视频帧的边缘特征,在4 × 4子块的两个特定区域分别选择一个量化DCT系数来嵌入水印信息。与已有的视频水印算法不同,本文采用混沌序列的无规则性对子块进行分组,增强了算法的安全性,并且水印算法在提取的过程中不需要原始视频的参与,实现了盲提取,降低了算法的复杂度。实验结果证明,算法对重编码、高斯噪声和低通滤波等常见的水印攻击具有抵抗力,并适用于版权保护系统、法庭取证等安全性要求比较高的视频应用。然而,进一步的研究任务是在保证视频质量的前提下,如何减小水印嵌入所引起的误差漂移现象。
摘要:针对已有的视频水印算法安全性较差的问题,结合H.264的编解码特性,提出一种H.264压缩域安全型视频水印算法。算法首先对宏块中的16个子块进行标记,然后利用Logistic混沌序列、帧内预测模式和边缘特征选出前8个子块并将其分成两组,最后利用子块间能量差来嵌入水印。算法利用混沌序列对子块分组进行置乱增加了攻击者对水印信息进行篡改的难度,从而提高了算法的安全性。仿真实验证明该算法具有高安全性,另外具有较好的鲁棒性和透明性。
H.264视频回放 篇5
图像通信是近年来取得长足发展的现代通信技术, 图像压缩的进步则是通信发展中的重要组成部分。2003年3月, ITU-T/ISO正式公布了H.264视频压缩标准, 由于比以往的出色的性能, 被人们成为新一代视频压缩标准。它的优异的压缩性会在数字电视广播、视频实时通信、网络视频媒体传输以及多媒体短信等各个方面发挥重要的作用。本文主要是对H.264中的运动补偿中的关键技术进行分析。
二、H.264中运动补偿关键技术
对一个视频序列相邻的两帧或者几帧具有很强的相关性, 将图像的每一帧分成许多互部不叠的宏块, 利用当前的帧的前一帧或者后一帧给定一定的搜索范围内根据一定的匹配准则找到当前块的最相似块, 这个过程称为移动估计 (Motion Estimation, ME) 其表达方式是运动矢量 (Motion Vector, MV) , 如图2.1所示。
把前一帧的运动部分信息根据运动矢量补偿过来的过程称为运动补偿 (Motion Compensation, MC) 。在H.264中运动补偿技术在补偿的块的划分、补偿精度、多参考帧等方面有独到之处。
2.1 块的划分
与以前的视频标准不同, H.264中的获得运动补偿的块结构大小不再局限于宏块的基础, 可以将宏块分解成子块, 子块进行运动估计得到MV。每个宏块可以分解为1个16×16块、2个8×16块、2个16×8块或者4个8×8块。如果1个宏块被分解为4个8×8块, 每个8×8块还可以在分解成4个4×4的更小的子块, 如图2.2所示。
每个分割或子宏块都有一个独立的运动补偿。对大的分割尺寸而言, MV选择大分割类型只需要较少的比特, 但是补偿残差在细节区域能量将会非常高, 大的分割比较适合平坦区域;小尺寸分割运动补偿残差能量低, 但是需要比较多的比特表征MV和分割选择, 比较适合多细节区域。宏块的色度充分 (Cr和Cb) 则为相应亮度的一半 (水平和垂直各一半) 。色度块采用和亮度块同样的分割模式, 只是尺寸减半。
2.2 运动补偿精度
在基于块的搜索中相应快的步长部一定是整数。为了更精确的运动表示H.264标准中用了分数像素精度, 对亮度成分采用1/4像素精度, 色度1/8像素精度。。亚像素位置的亮度和色度像素并部存在于参考图像中, 需要利用临近已编码点进行内插而得到, 图2.3为亮度半像素位置内插。
内插像素生成:
首先生成参考图像亮度成分半像素。半像素点 (如b, h, m) 通过对相应整数像素点进行六抽头滤波得出, 权重为 (1/32, -5/32, 5/8, 5/8, -5/32, 1/32) 。b点的计算如下:
类似的, h有A、C、G、M、T滤波得到。当临近 (垂直或者水平方向) 像素点的所有像素都计算出, 剩余的半像素点便可以通过对6个垂直或者水平方向的半像素点滤波得到。例如j由cc, dd, h, m, ee, ff滤波得到。
半像素点计算出来以后, 1/4像素点就可以通过线性内插得出, 如图2.4所示。1/4像素点如 (a, c, i, k, d, f, n, q) 由临近像素内插得到, 如剩余1/4像素点 (p, r) 由一对对角半像素点线性内插得出。如e由b和h获得。
2.3 多参考帧
在以前的视频标准中对P帧进行帧间预测时, 只容许以前一个图像或者P图像为参考帧;对B帧图像进行预测时只容许以前后I图像或P图像为参考图像。作为一项改进, 在H.264中引入了多参考帧预测技术, 容许前向参考帧的数目从1到5。参考图像甚至可以时采用双向预测编码的图像。这样可以对周期性运动, 平移封闭运动和不断在两个场景间切换的视频流有效果非常好的运动预测。使用多参考帧同时也能很好的码流误码恢复, 但是需要额外的时延和存储容量。
基于JM8.6平台的多参考帧的测试结果如表2.4所示。QCIF序列的有三种, 运动复杂度从低到高, 分别为Akiyo、Silent和Coastguard它们的编码帧率分别为10fps、15fps和30fps;CIF序列为2种, 包好的运动复杂从低到高分别为Silent和Coastguard, 它们的编码帧率都是30fps。2.4表中的最右边4列数据是相对各自测试序列使用1个参考帧时PSNRY、编码时间、运动估计时间的增量和增率。有表中可以得出, 对于运动很平缓的Akiyo序列, 参考帧增加时, PSNRY只增加很缓慢, 最多为0.02dB, 但是编码时间和运动估计时间平均增加82.29%和200.05%;对于运动较为复杂的Silent和Coastguard, 参考帧增加时, PSNRY, 增加较Akiyo多, 但是最多为0.08dB, 编码时间和运动估计时间平均增加为72.83%和199.35%。
由上面的统计可以看出, 多参考帧并不像理论上分析的对编码有很大的提高, 但是却带来很大的开销, 所以在一般应用场合, 要尽量避免使用多参考帧。
参考文献
[1]Iain E.G.Richardson.H.264andMPEG-4Video Compression Video Coding for Next-generation Multimedia, Wiley Press, 2003.
[2]Yao Wang, Jorn Ostermann, Ya-Qin Zhang.Video Processing and Communication, Pearson Education, 2002.
[3]Joint Video Team (JVT) of ISO/IEC MPEG&ITU-T VCEG, “Joint Video Team (JVT) of ISO/IEC MPEG&ITU-T VCEG”, JVT-F100d2.doc, 6th meeting, Awaji, Island, JP, 5-13December, 2002.
[4]T.Wiegand, G.J.Sullivan, G.Bjontegaard, and A.Luthra, “Overview of the H.264/AVC Video Coding Standard, ”IEEE Trans.Circuits Syst.Video Technol., vol.13, pp.560–576, July2003.
[5]毕厚杰.新一代视频压缩标准H.264, 人民邮电出版社, 2004.
[6]陈志波.H.264运动估值与网络视频传输关键问题研究, 清华大学, 毕业论文, 2002.
[7]Joint Video Team (JVT) Test Model JM8.6Software at http://iphome.hhi.de/suehring/tml.
H.264视频回放 篇6
成立于2001年的视频联合工作组 (JVT) 为实现视频的高压缩比、高图像质量、良好的网络适应性, 提出了一个新的视频压缩编码标准, 称为H.264标准, 它不仅比H.263和MPEG—4节约了50%的码率, 而且对网络传输具有了更好的支持功能。因其引入了面向IP包的编码机制、有利于网络中的分组传输、支持网络中视频的流媒体传输等新性能, 使其对目前因特网多媒体传输和移动网中宽带信息传输具有重要的意义, 将有很好的应用范围和前景。然而, 其高效压缩性能也带来了对水印技术的诸多挑战, 由于压缩编码时图像DCT非零系数变稀, 系数幅值变小, 传统的视频水印技术受到了挑战。因此研究抗H.264标准压缩的视频水印技术具有重要的实际意义。文献[1]提出了一个混合水印方案, 将鲁棒水印嵌入到帧内编码图像 (I帧图像) DCT的对角线系数中, 将弱水印嵌入到运动向量上, 用于实现版权保护和认证的双重功能。文献[2]改进了该算法, 嵌入水印时引入自适应量化因子, 提高了水印的不可见性和抗攻击能力, 但此类算法要求水印位置的系数幅值足够大以抵抗压缩攻击。文献[3]提出了一种在H.264压缩视频中嵌入灰度图像的水印算法, 水印嵌入实际上是通过修改4×4DCT对角线系数的符号来实现的, 该算法具有一定的鲁棒性, 但水印信息在图像颜色单调区域会出现明显失真。现根据视频帧固定长度的图像组层 (GOP) 结构和色度块DC系数分布的特点, 提出了一种新的压缩域视频水印算法。
1算法基本过程
H.264标准压缩系统由视频编码层 (vcl) 和网络提取层 (networkabstractionlayer, nal) 两部分组成。vcl中包括vcl编码器与vcl解码器, 主要功能是视频数据压缩编码和解码, 它包括运动补偿、变换编码、熵编码等压缩单元, 根据视频压缩编码国标标准, 内部宏块的最终解码DC系数是从编码中解码的差分值 (dc dct differential) 加上预测值 (dc dct pred) 恢复出来的[4]。另外视频数据具有层次化的数据结构, 在这个结构中图像组层是由相互间有预测和生成关系的一组I、B、P图像构成, 而头一帧总是用于视频随机访问同步的I帧, 且I帧是唯一仅使用自身信息进行编码的图, 而P帧和B帧都是预测图, P帧是从过去的I图像和P图像使用运动补偿预测进行编码的图, B帧是从过去的和或将来的I图像或P图像使用运动补偿预测进行编码的图, I、B、P图像结构和关系如图1中视频帧栏所示水印算法选取I帧DCT系数差分值为水印嵌入点算法基本过程如图1所示。
读取视频数据后, 根据GOP结构选取出足够的I帧, 对I帧进行16×16分块, 算出色度块均值和方差, 筛选出符合条件的分块, 根据水印数据流的信息来修改其DC系数以达到隐藏水印的目的, 读取水印则与之相反。
2算法实现
2.1嵌入点的选择
选取I帧后, 设每个I帧有N个16×16大小的色度块, 用矩阵Uk (k=0, 1, …, N-1) 表示如下
其第k个色度块均值Mk和方差σk分别为
整个I帧色度平均方差σ2为
为了防止嵌入的水印信息在图像颜色单调区域出现明显失真, 需要根据色度块的方差做判断, 若σ
2.2水印的嵌入
将视频流中I帧的色度DC系数VLC解码、逆量化得到原始DC系数Di, 用固定的量化因子Qdc/Di得到D, i然后根据公式 (4) 修改D, i得到D”i, 用视频流自身的量化表量化D”i, VLC编码后写入视频码流中形成含有水印的视频流, 从而完成水印的嵌入[5]。
(4) 式中, m=mod (D, n, D) , D表示水印强度, D值越大, 则水印强度越强, 其值可视视频背景复杂性而定。
2.3水印的提取
提取水印时, 先将视频流中I帧的色度DC系数VLC解码, 逆量化得到DC系数D, i, 用固定的量化因子QDC/DC系数Di得到D, I, 然后根据公式 (5) 恢复水印信息。
3试验结果与性能分析
3.1实验素材
为了算法的通用性考虑, 实验分别用文字图片和符号图片做水印图像进行。并让水印图片的大小不同, 以便比较算法的嵌入信息量和时间代价, 水印图片如图2所示。
同样为了让算法能有实际使用价值和通用性, 采用二种视频序列来做实验, 一种是学校精品课程中显微内窥镜采样视频embryo, 因不同的学校实际应用中硬软件的不同, 其格式迥异, 需要考虑格式的置换, 代表了一定的实际使用价值, 如图3 (a) 所示。;一种是正常拍摄的标准YUV序列children, 代表了一定的通用性。如图3 (b) 所示:
3.2不可感知性
如图3所示, 图3 (a) 和图3 (b) 分别为原始视频序列embryo 和children 中的某一帧图像, 图4中 (a) 和图4 (b) 分别为其相应的含水印视频帧图像, 可以对比看出, 含水印视频图像与原始视频图像从主观视觉上看, 两者几乎没有差异, 满足不可感知要求。
由于I帧是P帧和B帧解码时的参考帧, 改变了I帧的数据肯定会产生失真, 导致视频质量的下降, 测试其失真程序可用放大若干倍进行比较, 如图4所示, 将原始视频和水印视频在图像处理软件中放大7倍, 其对比效果并无太大区别, 仍然满足不可感知的要求。
实验中还采用PSNR (峰值信噪比) PPNS来定量分析水印系统的不可感知性, PSNR 定义如下。
PSNR=10lg (2552/MSE) (6)
(6) 式中MSE是均方误差, MSE的值越小表明图像质量的改变越小, MSE 的计算公式如下
(7) 式中M 是原始视频数据, Mw 是嵌入水印后的视频数据, H 、W 分别是每帧图像的高和宽。表1 给出了水印嵌入前后频序列的PSNR 和MSE。其值表明了水印的不可感知性较高。
3.3鲁棒性
鲁棒性要求含水印视频信号经过信号处理操作后, 水印检测器仍能检测出载体作品中是否含有水印。这里使用归一化相关系数CN来衡量算法的鲁棒性[6]。归一化相关系数CN的计算公式如下[7]
其中, w, w′分别为原始机密信息序列、提取的机密信息序列。NC越大, 表明相似性越好。
利用NC计算公式, 得出实验数据如表2、表3所示。
表2中“未攻击”栏给出了在没有任何攻击的情况下提取出的水印图像与原始水印图像相比几乎没有任何失真, 此时, CN值为1。其它常规攻击后, 除帧删节50%后的提取CN值小于0.8外, 其它提取的结果归一化相关系数CN值普遍较大, 二种视频水印的提取结果相当理想的。总的来讲, 嵌入水印后的图像基本上与原图像一致, 说明此方法在未压缩时具有较好的鲁棒性。
表3所示的结果表明不同的视频文件经MPEG或h.264标准压缩后压缩后文件大小只有原AVI文件的 (0.5-2.0) %, 但水印提取的结果图像清晰, 效果良好, 系数CN理想。从而表明算法的抗压缩性能较好。同时, 实验结果也表明了不同的视频文件其水印提取效果是不一样的, 这主要是不同的视频, 改变其I帧数据时会产生失真积累效应, 积累的多少与视频背景的复杂程度关系很大, 在实际应用中可以考虑对I帧后的P帧进行重新预测, 从而进行补偿。
4结论
本文方案属于压缩视频水印, 它在压缩视频流中修改I帧DC系数, 在对编码数据进行解码的过程中完成水印的嵌入, 实验表明, 该算法除抵抗常规攻击外还能抵抗H.264压缩及各种格式的转换处理, 同时因其利用了解码器速度快的优势, 提高了水印嵌入、提取的效率, 为以后实时对视频节目进行水印嵌入的研究无疑提供了参考, 另外水印提取时不需要原始的视频载体以及水印的任何信息, 属于盲水印技术, 可广泛应用于视频内容的版权保护领域。
参考文献
[1]Qiu Gang, Marziliano P, Anthony TS H, et al.Ahybrid watermark-ing scheme for H.264/AVC Video.Proceedings of the17th Interna-tional Conference on Pattern Recognition.UK:Cambridge Press, 2004:865—869
[2]曹华, 周敬利, 余胜生, 等.基于H.264低比特率视频流的半脆弱盲水印算法实现.电子学报, 2006;34 (1) :40—44
[3]Zhang Jing, Ho A T S.Robust digital image-in-video watermarking for the emerging H.264/AVC Standard.Proc of IEEE Workshop on Signal Processing Systems Design and Implementation.Singapore:[s.n.], 2005:657—662
[4]杨义先.数学水印基础教程.北京:人民邮电出版社, 2007
[5]欧阳琦, 李炳法, 林春蔷, 等.基于DCT域的图像数字水印技术.信息技术, 2005; (9) :20—23
[6]曹晓军.变换域数字图像水印算法探究.兰州商学院学报, 2006;6 (4) :117—120
H.264视频回放 篇7
H.264/AVC标准是一种高性能的视频编解码技术,相比以前的标准,具有更高的压缩率、高质量图像、容错功能、并有很强的网络适应性。
随着Android技术的迅猛发展和日趋成熟,其开放性、便携性、良好的兼容性、无缝结合网络通信等特点将使Android操作系统在未来工业领域中有广泛的应用。
1 系统概述
基于Android平台的视频服务器监控系统由监控前端、监控终端和网络3部分组成。监控前端是一个嵌入式Android系统,通过S3C6410的USB摄像头采集视频数据,并传送给Android应用层的编解码模块,应用层通过调用JNI接口链接Android底层封装的动态库,实现基于H.264标准视频压缩,将压缩数据打包发送到IP网络上,监控终端通过网络接收数据包,最后解码进行实时播放。基于Android平台的H.264视频压缩技术的总体框架图,如图1所示。
2 系统的硬件设计
基于Android视频服务器系统包括视频信息采集模块、视频信息编解码模块、视频数据传输和显示模块组成。视频信息采集和编码模块是整个监控系统的前端,主要由USB摄像头和Android底层的系统库实现;视频数据传输模块是整个监控系统的中继,负责监控前端和监控终端视频数据的交互工作;监控终端主要由LCD显示模块和电源模块组成,LCD显示模块实时查看视频,电源模块为系统提供运行所需的能量。
该技术设计采用Samsung公司的ARM11 S3C6410嵌入式处理器为核心,其主频为533 MHz/667 MHz,S3C6410是基于16/32-bitRISC内核的低成本、低功耗、高性能微处理器解决方案,内部集成多个功能强大的硬件加速器,结合外部极佳的接口设备,能够满足Android程序开发的需求。其外接存储设备包括256 M的DDR-SDRAM、2 MB的NOR Flash、2 GB的NAND Flash。外围接口包括串行口、JTAG调试接口和USB接口,其中USB接口连接摄像头负责视频数据的采集,LCD进行实时显示。视频采集设备硬件结构如图2所示。
3 软件设计概述
Android的系统构架分为应用层、应用框架层、系统运行库和Linux内核层,Android应用程序的开发通过应用框架与Android底层进行交互。技术实现设计采用模块化设计方案,主要包括底层驱动移植模块、视频采集模块、视频压缩传输模块和视频显示模块。
基于Android的视频服务器系统主要包括监控前端、中间网络和监控终端。监控前端的USB摄像头采集视频数据,Android应用层调用封装的JNI库进行标准的H.264压缩,经过网络打包发送给监控终端,终端通过解码实时查看视频。其中流媒体服务器主要由3层结构组成:服务器、网络服务接口和驱动模块,如图3所示。
3.1 操作系统结构
Android作为终端操作系统,其软件层次自下而上分为:基于Linux内核的操作系统层,各种库和Android 运行环境,应用程序框架和应用程序。结构图如图4所示。
(1)应用程序。
应用程序包括Email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有应用程序均使用Java语言编写。
(2)应用程序框架。
应用程序架构设计简化了组件的重用;任一个应用程序都可以发布功能块并且其它应用程序都可以使用其所发布的功能块。
(3)系统运行库。
当使用Android应用框架时,Android系统会通过一些C/C++库来支持使用的各个组件,使其能更好地服务。其中包括Bionic系统C库,多媒体库,关系数据库SQLite,Web浏览器引擎Webkit等。
(4)Linux内核。
Android 的核心系统依赖于 Linux 2.6内核,它同时也是硬件和软件之间的抽象层。此外Android对其做了部分修改,主要涉及两部分。Binder(IPC):提供有效的进程间通信,实现了自己的功能;电源管理:主要为省电,作为手持终端设备低耗电是追求目标。
3.2 底层驱动移植模块设计
Android系统本身是一个庞大的系统,移植需要考虑Android系统的硬件抽象层(HAL)和Linux中的相关设备驱动程序。移植的目的就是为了改动较小的内容,支撑较为庞大的上层系统。该系统驱动的移植主要为满足上层应用层的USB摄像头视频采集需求。
Android系统驱动移植首先要熟悉硬件抽象层的接口,其次要集成和复用已有的驱动程序,主要的工作量在硬件抽象层的实现中。移植的主要工作有两方面:Linux驱动、Android系统硬件抽象层。
USB摄像头驱动程序介于视频采集应用程序与Linux内核中USB核心的中间层。其一,USB摄像头驱动向USB核心注册本身的信息,并调用USB核心提供的API函数为上层服务;其二,应用程序通过调用USB摄像头驱动的一套接口函数进行视频采集和调整摄像头参数等操作,如图5所示。
3.3 视频采集模块设计
基于Android系统的H.264压缩技术的视频采集部分包括Android视频流的提取以及Android界面设计两部分。Android可以在拍照视频预览时截取视频流的数据。每获得一帧调用相应的接口函数。其中在Android的上层界面中定义了一个SurfaceView类,主要用于显示采集到的图像。Android通过USB摄像头采集格式为YUV的视频数据,通过SurfaceView类接口传输到应用层通过图像绘制进行显示。
应用程序界面设计具体步骤:打开Android项目里的res\layout目录,用xml语言来编辑设计程序界面。首先确定界面的布局,嵌套ViewGroup的LinearLayout和RelativeLayou进行布局,调整android:layout_width、android:layout_height、android:background、android:padding等参数值,达到满意的整体布局效果。然后在ViewGroup布局中添加View控件:textview、button根据实际需要调整各控件的android:id、android:layout_height、android:layout_width等参数值,最终完成对Android应用程序UI的布局。
3.4 H.264视频压缩模块设计
H.264是由ITU-T的VCEG和ISO/IEC的MPEG联合组建的联合视频组提出的一个新数字视频编码标准。它由VCL层和NAL层组成,VCL层主要负责编解码,主要包括运动补偿、变换编码、熵编码等;NAL层主要为VCL提供与网络无关的统一接口,负责将视频数据封装打包后传递给网络。
H.264标准视频压缩算法包括5个环节:帧间帧内预测编码、正反变换编码、量化反量化编码、环路滤波和熵编码。算法流程如图6所示。
技术实现是在Android操作系统上封装编译生成Android底层Library的JNI动态链接库,进而实现H.264标准编解码。具体实现步骤:选择合适的编码器,系统采用X264的编码器。X264省去了部分复杂增益,编码速度非常快,可以对CIF格式图像实时编码。H.264压缩画面以及分辨率:支持CIF/QCIF;图像分辨率:352×288;压缩格式H.264、MPEG-4压缩格式;压缩帧率:1~25帧可调;压缩码率:64 kbit·s-1~2 Mbit·s-1;码流控制方式:变码流、动码流、混合码流。H.264的优势主要体现在下面几个方面:(1)精确匹配解码,避免错误累积;(2)更简单的规范实施;(3)强大的容错能力;(4)高效压缩,比其他视频压缩能力高50%以上;(5)时延级差,以适应更多应用环境等。
3.5 主程序流程设计
基于Android视频服务器系统终端要接受来自监控前端的视频数据,必须采用Socket网络通信技术。
在进行Socket通信前必须对Socket初始化包括:创建Socket、绑定Socket和端口号、开始监听端口等步骤。创建Socket服务线程。当监听产生后,主进程负责不断循环地监听接收到的请求并建立新的客户连接Socket,创建针对此Socket的通信进程。
3.6 显示模块设计
Android平台的视频服务器监控系统终端显示需要对视频数据进行解码,通过LCD液晶显示屏实时观看。解码过程是编码的反变换,其中包括获取视频流,视频流信息的配置,视频流的帧解压,以及图像处理过程。该系统选择4.3寸(10.92 cm)LCD显示屏在进行显示端实时查看视频图像。
4 结束语
基于Android系统的视频客户控制界面,无需专用监控软件、使用方便、成本低。系统通过Arm11 CPU直接进行视频处理和传输,在提供高性能的同时,也允许在性能和功耗间做权衡满足某些特殊的应用需求。鉴于Android视频服务器的高性能和前沿性,基于Android平台的视频服务器可以在安全性要求高的各种场合得到应用,同时结合实际的应用再可以进行功能扩展,可应用到众多的有线或无线视频监控领域。
摘要:提出了基于Android平台的H.264视频压缩技术设计方案,该方案终端设计是基于S3C6410处理器的硬件和Android 2.3版本的软件平台,通过终端USB摄像头的驱动移植、视频图像的H.264标准压缩以及Socket网络编程,实现网络视频监控的实时显示。
【H.264视频回放】推荐阅读:
视频回放07-20
2022年消防安全直播回放08-22
这位伟人必须铭记回放伟人一生11-11
市共青团工作精彩回放11-08
央视《开学第一课》回放观后感09-13
央视节目《开学第一课》回放观后感08-20
2022北京冬残奥会开幕式回放11-24
OvMeet手机视频会议视频教学用户手册10-03
视频课件07-20