文章下载地址:http://download.csdn.net/detail/luckydarcy/9623885
分三个阶段学习
1、第一个阶段:
学习H.264,首先要把最基本最必要的资料拿在手里,内容包括:标准文档(即 ITU 协议,在群FTP“协议标准”目录里)、测试模型(即ITU 提供的编解码器源代码,在群FTP“程序源代码”目录里)、经典文章(即后面提到的文章,在群FTP“H.264 相关论文\经典文章”目录里)。怎么使用这些资料呢?首先看里面的《H.264_MPEG-4 Part 10 White Paper》,看完之后再看《Video coding using the H.264 MPEG-4 AVC compression standard 》和《Halsted Press H.264 And MPEG-4 Video Compression Video Coding For Next Generation Multimedia eBook-LiB 》, 然后可以抽空看《Overview of the H.264_AVC Video Coding Standard.pdf》。前三篇文章看完后,你应该对H.264 的整体框架有个比较深入的了解了。这个时间可能只需要花费你三周左右的时间(对于我这样的笨蛋好像是要这么长时间的。如果你碰巧用了比这个时间还长的时间,那并不说明你比我更笨,只能说明你肯定天天陪MM聊天去了。呵呵~~~),最后一篇文章是《Overview and Introduction to the Fidelity Range Extensions》,该文的价值主要在于对H.264 的第四个档次high profile 做了介绍,前面的文章都没有涉及该档次。
2、第二阶段:
然后你就可以看代码了。这个时候你最常用的工具就是标准文档和测试模型。看代码也有讲究。并不是像我开始那样看得那么仔细,结果后来才知道远没有这个必要。正如 peter 李说的:看代码也要先从整体框架入手。先搞懂H.264 的整体框架在代码里是怎么分布的,一个功能模块的前伸模块和后继模块是什么。也就是搞清楚整个代码流程。这个阶段对标准文档的使用可能很少。如果你使用的测试模型是JM,那么有一个好处:JVT 提供了该测试源代码的说明书——H.264_MPEG-4 AVC Reference Software Manual(在群FTP“H.264 其他资料”目录里),对编解码的所有参数做了详细介绍。
3、第三阶段:
然后你找到一个自己感兴趣的切入点,开始以此为中心研究这个问题。你研究问题的时候应该是联系测试模型来研究,这个时候你就需要仔细看代码中对这个问题的实现了。这个阶段我绝对支持你一行行代码跟踪,一个参数一个参数地跟踪。而代码中不懂的地方可能需要查标准。这时你再来看标准文档就有了针对性。也因为能将标准文档和代码对应起来,从而看标准文档也不觉得有太大困难,也能明白标准文档说的是什么问题,在测试模型中是如何通过代码实现的。在这个阶段中,会牵连到很多H.264 的相关知识,这样通过以点带线,以线带面。你会对H.264 的内容认识越来越多。而你也就找到了自己的方向,最终走上了缔造中国人的H.264 的光辉大道,呵呵~~~
==========【注意事项】==========
1、切忌将代码和标准文档独立开看,否则,你的困难会很大(当然可能是因为我太笨了,对于“甜菜”的你可能无论怎样都能应用自如。呵呵~~~)。
2、对于刚开始接触H.264 的人,切忌直接看代码和标准,哪怕是将标准和代码结合起来看,你也会不太顺利。换句话说:在没有了解H.264 整体框架之前,你最好什么都不要做。
3、你千万不要觉得自己参加讨论,以及帮助别人找答案(当然是在你觉得别人问的问题你似曾相识的时候)是一个浪费时间的过程。因为你参加讨论,特别是你帮别人找答案的时候,很多你似是而非的问题却能够得到一个更深刻的认识。
4、学问,学问,即要问也要学。不要养成自己的依赖思想。其实你在自己查资料的过程中,也会学到很多东西。比如会知道某个问题在哪篇文章里能找到答案,或者收集到更多相关问题的有价值的文章……而且自己查到的到底比别人告诉的印象深刻。
5、读代码要讲究方法。码中有很多变量,不要一开始就去看头文件,想把里面所有变量都弄清楚是什么直接从main 函数开始读c 文件就可以了。遇到不懂的变量再去查头文件,如果头文件里没有说明,自己又理解不了的问其他人——不要养成依赖性。
PS :我所知道的三本讲H264 的中文书籍
1、《H.264 和MPEG-4 视频压缩》:欧阳合(我看的英文原版,翻译过来的应该也不错)
2、《新一代视频压缩编码标准—H.264/AVC》:毕厚杰(书中有较多错误,但仍然值得买,建议只做参考)
3、《小波编码与网络视频传输》:沈兰荪,卓力(个人觉得不错,有关于high profile 的介绍)
H.264 学习资源
JVT 所有的会议文件都在这里
http://ftp3.itu.ch/av-arch/jvt-site/
ITU 的站点
http://ftp3.itu.ch/av-arch/
ftp://standards.polycom.com
流媒体论坛的FTP
ftp://ftp.wonew.org/
用户名:liumeiti.upload
密码:liumeiti.upload
清华的FTP
ftp://166.111.66.184
用户名:video
密码:smth
所有JM 的测试模型
http://iphome.hhi.de/suehring/tml/
中国人的H.264–AVS
http://www.avs.org.cn/
视频序列下载网址
http://trace.eas.asu.edu/
http://ise.stanford.edu/video.html
http://www-mobile.ecs.soton.ac.uk/peter/links/work.html
http://eeweb.poly.edu/~yao/VideobookSampleData/doc/sample/sample.htm
http://www.tkn.tu-berlin.de/research/evalvid/
http://www.cipr.rpi.edu/resource/sequences/ (有D1 尺寸)
http://kbs.cs.tu-berlin.de/~stewe/vceg/sequences.htm
http://standard.pictel.com/ftp/video-site/sequences
http://www.i3s.unice.fr/~garciav/goodies.php
H.264 论坛
http://bbs.lmtw.com/index.asp?boardid=108
http://bbs.edw.com.cn/index.asp?boardid=47
http://www.newsmth.net/
H.264 个人站点
http://lspbeyond.go1.icpcn.com/
http://spaces.msn.com/members/naiqa/
http://blog.chinaunix.net/index.php?blogId=2553
http://h263.blogchina.com/
http://blog.csdn.net/sunshine1314/category/123075.aspx
http://zmshy2128.blog.163.com/
http://www.fastvdo.com/spie04/
H.264/AVC 综述文章,包含了新的高精度拓展(Sullivan, Topiwala, and Luthra)
http://iphome.hhi.de/wiegand/pubs.htm
一些有关H.264/AVC 的文章(Wiegand)
http://iphome.hhi.de/marpe/pub.htm
更多的关于H.264/AVC 的文章(Marpe)
http://iphome.hhi.de/suehring/tml/
H.264/AVC 参考软件
http://www.vcodex.com/h264.html
H.264/MPEG-4 Part 10 教程(Richardson)
http://www.vcodex.com/h264mpeg4/
书: H.264 and MPEG-4 Video Compression (Richardson)
http://internet.impress.co.jp/books/1983/
H.264/AVC 教科书(日文: Okubo, Kadono, Kikuchi, and Suzuki)
http://ftp3.itu.ch/av-arch/jvt-site
JVT Experts Group 文档
http://www.mpegla.com/news/n_03-11-17_avc.html
MPEG LA 关于H.264/MPEG-4 AVC 专利授权的条款
http://www.videolan.org/x264.html
一个基于GPL 的H.264 编码库,支持大部分H.264 的功能
http://www.m4if.org/
MPEG 工业论坛
http://www.itu.int/rec/recommendation.asp?type=folders&lang=e&parent=T-REC-H.264
ITU-T 官方网页
http://www.iso.ch/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=40890&ICS1=35&
ICS2=40&ICS3= H.264
ISO 官方网页
http://www.wwcoms.com/technology/standard.htm
W&W Communications H.264 概述和IEEE 文章
http://www.apple.com/quicktime/hdgallery/
苹果公司H.264 素材实例
如何读标准和代码
首先,还是要弄清楚编解码的流程和H.264 的关键技术,看白皮书就知道了,另外 H.264 综述类的文章和别人的学位论文一般也会讲到;其次,弄清楚代码的各个函数实现的功能,这个可以看看JM 代码里各个函数前面的函数说明;最后,弄清楚标准各个章节讲的什么内容:这里只说重要的。第三章是名词解释,第四章是缩略语,第五章是一些计算方式和运算符号的说明,第六章是与H.264 相关的一些视频基础知识和H.264 中用到的一些过程推导,第七章是NALU 及其以下语法结构的语法和语义(如果要知道码流结构就要看这一章了),第八章是详细说明解码过程中某一个模块的功能怎么完成,第九章是熵编码,附录A 是关于profile 和level 的具体规定,附录B 是关于如何从字节流中解析NALU(标准没有说明如何在RTP 流中解析NALU)。
有了上面的基本知识,下面我们结合对码流的解析过程来讲讲怎么读标准:
1、如果是字节流的码流当然就首先要对字节流进行解析,这就要看附录B了;如果是 RTP 格式的码流,那首先就要按RFC3984 来解析了(标准没有规定RTP 格式码流的解析过程);
2、字节流解析完后提取出来的就是NALU 了,对NALU 的解析就要看7.3.1 小节了。第七章中黑色的粗体字都是在码流中可能出现的语法元素,解码器的首要任务就是要对这些语法元素进行解析。对于这些码流中的语法元素我们要进行解析必须知道三个问题:
(1)、什么时候存在于码流中?这样我们才能知道当前解析的是哪个语法元素;
(2)、采用什么样的熵编码方式?这样我们才能知道如何解析;
(3)、含义是什么?这样我们才知道解析出来之后用来干什么。
三个问题的答案分别是:
(1)、有if 条件关联的就是可能出现的,没有if 条件关联的就是必然出现的。例如,7.3.1小节表中的forbidden_zero_bit 就没有if 条件关联,所以它必然出现在码流中;
(2)、每个语法表最后一列都对所在行语法元素的熵编码方式做了符号表示,而各个符号是什么意思那就去看7.2 小节最后的部分;
(3)、看7.4 小节与语法表对应的语义部分,例如你查的语法表是7.3.1,那么该语法表里出现的语法元素的解释就在7.4.1 小节中。
3、NALU 的前面三个语法元素所组成的一个字节我们称为NALU 头,其余部分(也就是语法表7.3.1 中的其余部分)我们称为NALU 体。对NALU 体的解析要看7.3.2 小节。因为NALU 有很多种类型,所以要针对NALU 的不同类型去解析NALU 体(表7-1 说明了不同NALU 对应的语法表)。例如,如果当前的NALU 是SPS,那么当然就要看7.3.1小节;如果当前的NALU 是DPA,那么当然就要看7.3.2.9.1 小节了;
4、对于属于VCL 的NALU(哪些NALU 是VCL NALU 呢?如果你看了nal_unit_type的语义,你就应该知道),例如表7-1 中类型为5 的NALU,根据表7-1 我们知道NALU体的语法表是7.3.2.8。而从7.3.2.8 我们可以看到,对这种NALU 的NALU 体解析实际就是对片级语法进行解析。语法表7.3.2.8 显示片级语法解析首先要解析slice_header()(这种带括号的表示是另一个语法结构),那么slice_header() 怎么解析呢?往下看,7.3.3 的所有内容都被第一行的slice_header() 包括在内,所以7.3.3 就是对slice_header() 这个语法层的码流规定;
5、按照语法表7.3.2.8 解析完了slice_header() 就该解析slice_data() 了。下面以最常见的 I 帧(CAVLC 熵编码、非MBAFF)的解析过程为例简单描述怎么继续读标准。这时在码流中出现的第一个slice_data() 层的语法元素是语法表7.3.4 中的macroblock_layer(),也就是说直接到了宏块层的语法解析,那就要又要看7.3.5 小节了;
6、基于我们对编解码流程的了解,我们知道解码是一个预测值加残差得到重建图像的过程,那么我们下面的解码过程就要分成两步走了:首先,得到预测值;其次,得到残差。基于我们对H.264 关键技术的了解,我们知道intra 宏块(提醒:我们举的例子是I 帧,因此解析的是intra 宏块)的预测值是需要使用到预测模式的,所以我们需要解析语法表7.3.5 中的mb_pred(mb_type) 语法层,那么又去看7.3.5.1 小节。按照7.3.5.1 小节解析出宏块或块的预测方式后我们怎么计算预测值呢?去看标准8.3 小节;得到预测值后我们继续按照语法表7.3.5 解析语法元素直到residual() 语法层,这就又要去看7.3.5.3 小节;按照7.3.5.3 小节解析出残差系数后我们如何把它还原成真实的残差呢?去看标准8.5 小节;
7、预测值和残差都有了,加起来就是解码图像了。解码的主要工作到此也算基本完成了。当然,上面的过程中还会用到标准其他章节的相关内容(例如,8.5 小节会用到5.7 小节中定义的InverseRasterScan),这就留给大家自己去学习了。
上面讲了如何读标准,那么如何读代码呢?非常简单,因为你现在已经知道了代码中各个函数所实现的功能以及标准各个章节所涉及的内容,那么你就该知道标准某个部分的内容与代码中的哪个函数对应,因此对于你想详细了解实现过程的模块,对照标准去仔细啃那个函数吧。对于代码中不明白的变量或者参数,把程序跑起来,看第1 个MB 解码时候该变量的值是多少,第23 个MB 解码时候该变量的值是多少……多做几个观察值,注意不要选择特殊位置,然后总结一下规律,这样你就自然能分析出该变量的作用和含义了。
以上讲的是解码过程,编码过程就是解码的反过程,因此同理。