H.264学习历程(天之骄子)

半年前,我知道了H.264这个名词。那个时候决定学习H.264,可是我连资料都不知道如何收集。而且整个学校就只有我一个人在学习H.264,找不到人交流,所以那个时候学得真的是举步维艰,很痛苦,而能在网上认识一个学习H.264的朋友真的是一件让我很高兴的事。 后来慢慢在网

半年前,我知道了H.264这个名词。那个时候决定学习H.264,可是我连资料都不知道如何收集。而且整个学校就只有我一个人在学习H.264,找不到人交流,所以那个时候学得真的是举步维艰,很痛苦,而能在网上认识一个学习H.264的朋友真的是一件让我很高兴的事。

后来慢慢在网上找到了一些介绍H.264的文章,当然也找到了peter李的网站,找到了流媒体论坛。那个时候在论坛里看见别人问的问题,我都完全不懂。看见别人要这样资料要那样资料,我也不知道这些资料怎么能够用得着。最有趣的是我居然把JVT的会议文章全部下载下来了——当时并不知道这几百兆的东西到底怎么用,现在倒是知道它的用处了,看来还是没有白下,呵呵~~~。

一开始就想,先看看标准吧。因为标准是英文的,又特别长。所以为了避免看了后面忘记了前面,我就开始翻译,看一段翻译一段。可是这个过程真的是又枯燥又痛苦。而且看着300多页的东西,要像这样来看完,还真是没有勇气和信心。想了想还是算了吧,看源代码吧。当时因为知道JM是标准的测试模型,所以就看JM了。一开始看代码可是很老实的,每句程序,每个变量都跟踪。等把读入参数、初始化变量跟踪完了,才知道,这一段没必要看那么细致,完全可以跳过的。

就这样看代码看不懂的时候就查标准、去流媒体论坛问。可是论坛有好处也有坏处,好处是可以有很多人参与,坏处是你问的问题无论怎样都不可能马上知道答案,于是一般来说对你继续读代码就是一个阻碍。于是去找H.264的QQ群,很高兴找到了“H.264家园”,可是随后很失望——见不到人问,也见不到人回答我的问题。于是,生气了,自己建了一个群,这样终于有了一个比较好的交流环境。可是那个时候的H.264在我看来还只是一个遥不可及的华丽殿堂。QQ群里大家讨论的问题我仍然不懂。而我为了能尽快弄个像样的题目来作为毕业论文,那个时候也没有继续看H.264的内容,只不过花了一个半月的时间来实现一个在今天看来比较肤浅的错误隐藏算法(因为我给自己定的方向是错误隐藏)。

等到我的这篇论文完成已经是9月中旬了,而这个时候对H.264仍然是那么陌生。因为这段时间没有继续看H.264的内容,以前看过的内容,本来理解就不透彻、印象也就不深,所以基本上都忘记了。所以这个时候的我可以说对H.264还处在只是知道个概念的阶段。H.264实在是个庞大的东西,而对于中国人来说,它又是如此的新(个人认为),大面积的商用都还没有开始。我要想在毕业之前在这里面做点有价值的东西在当时看来实在不太可能,于是只有硬着头皮继续研究自己的错误隐藏,希望能给自己的毕业论文增加一点分量。这样就开始看JM关于帧间错误隐藏的代码。因为JM帧间错误隐藏比帧内的复杂得多,涉及到很多相关的问题。所以在看代码过程中也要对这些问题做一些了解,再加上QQ群里的经常讨论,让我真正开始了学习H.264的起步。

等我把帧间错误隐藏看完,已经是10月底了,而这个时候正好我们学院要搞一次学术研讨会。为了能给自己的毕业和以后找工作增加一点砝码,我决定参加。于是开始准备会议报告,通过准备会议报告,让我对H.264的整体框架又一次做了回顾和熟悉。时间终于走到了今天,我很高兴地感觉到,自己已经站在H.264的门口了——总是有进步的。呵呵~~~

现在自己对学习H.264也有了一些自己的想法,所以写出来和大家一起探讨:

1、第一个阶段:
学习H.264,首先要把最基本最必要的资料拿在手里,内容包括:标准文档(即 ITU 协议)、测试模型(即 ITU 提供的编解码器源代码)、经典文章(即后面提到的文章)。怎么使用这些资料呢?首先看里面的《H.264_MPEG-4 Part 10 White Paper》,看完之后再看《Video coding using the H.264 MPEG-4 AVC compression standard》和《H.264 And MPEG-4 Video Compression》,然后可以抽空看《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 做了介绍,前面的文章都没有涉及该档次。这个阶段可以辅助多看点综述类的文章,加强对 H.264 的初步了解。

2、第二阶段:
然后你就可以看代码了。这个时候你最常用的工具就是标准文档和测试模型。看代码也有讲究。并不是像我开始那样看得那么仔细,结果后来才知道远没有这个必要。正如peter李说的:看代码也要先从整体框架入手。先搞懂H.264的整体框架在代码里是怎么分布的,一个功能模块的前伸模块和后继模块是什么。也就是搞清楚整个代码流程。这个阶段对标准文档的使用可能很少。如果你使用的测试模型是JM,那么有一个好处:JVT提供了该参考源代码的说明书——H.264_MPEG-4 AVC Reference Software Manual(最新版本是JVT-X072),对编解码的所有参数做了详细介绍。另外JVT还提供了参考源代码编码器手册JVTO079,对参考源代码中编码算法做了详细阐述(ITU协议其实也就是解码器手册)。

3、第三阶段:
然后你找到一个自己感兴趣的切入点,开始以此为中心研究这个问题。你研究问题的时候应该是联系测试模型来研究,这个时候你就需要仔细看代码中对这个问题的实现了。这个阶段我绝对支持你一行行代码跟踪,一个参数一个参数地跟踪。而代码中不懂的地方可能需要查标准。这时你再来看标准文档就有了针对性。也因为能将标准文档和代码对应起来,从而看标准文档也不觉得有太大困难,也能明白标准文档说的是什么问题,在测试模型中是如何通过代码实现的。在这个阶段中,会牵连到很多H.264的相关知识,这样通过以点带线,以线带面。你会对H.264的内容认识越来越多。而你也就找到了自己的方向,最终走上了缔造中国人的H.264的光辉大道,呵呵~~~

==========【注意事项】==========
1、切忌将代码和标准文档独立开看,否则,你的困难会很大(当然可能是因为我太笨了,对于“甜菜”的你可能无论怎样都能应用自如。呵呵~~~)。
2、对于刚开始接触H.264的人,切忌直接看代码和标准,哪怕是将标准和代码结合起来看,你也会不太顺利。换句话说:在没有了解H.264整体框架之前,你最好什么都不要做。
3、你千万不要觉得自己参加讨论,以及帮助别人找答案(当然是在你觉得别人问的问题你似曾相识的时候)是一个浪费时间的过程。因为你参加讨论,特别是你帮别人找答案的时候,很多你似是而非的问题却能够得到一个更深刻的认识。
4、学问,学问,即要问也要学。不要养成自己的依赖思想。其实你在自己查资料的过程中,也会学到很多东西。比如会知道某个问题在哪篇文章里能找到答案,或者收集到更多相关问题的有价值的文章……而且自己查到的到底比别人告诉的印象深刻。
5、读代码要讲究方法。代码中有很多变量,不要一开始就去看头文件,想把里面所有变量都弄清楚是什么。直接从 main 函数开始读 c 文件就可以了。遇到不懂的变量再去查头文件,如果头文件里没有说明,自己又理解不了的再去问其他人——不要一开始就养成依赖性。
6、使用 JM 的 TX 如果不需要研究高清,那么建议用 JM86。高版本为了支持高清,把很多原本容易理解的地方修改得晦涩难懂了,增加了理解代码的困难。

PS :我所知道的三本讲H264的中文书籍
1、《H.264和MPEG-4视频压缩》:欧阳合(我看的英文原版,翻译过来的应该也不错)
2、《新一代视频压缩编码标准—H.264/AVC》:毕厚杰(书中有较多错误,但仍然值得买,建议只做参考)
3、《小波编码与网络视频传输》:沈兰荪,卓力 (个人觉得不错,有关于 high profile 的介绍)

——天之骄子·firstime——
2005年11月12日

原文:bbs.chinavideo.org/viewthread.php?tid=988

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456147.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

插入排序:表折半插入

在前一篇插入排序:表插入中。我们用静态链表的存储方式。直接插入的策略,构建了一种新的插入排序算法:表插入。有人可能会想到:相同是静态链表的形式,为什么不使用更高效的折半插入策略呢?这样的想法真的非…

C++编译报错:重复定义

http://note.youdao.com/noteshare?idcb2bed862a2daae89775603168f297af转载于:https://www.cnblogs.com/taiyang-li/p/6637093.html

【机器学习】sklearn实现---归类为5大类

sklearn实现---归类为5大类 sklearn.preprocessing.scale()(最常用,易受异常值影响)sklearn.preprocessing.StandardScaler()sklearn.preprocessing.minmax_scale()(一般缩放到[0,1]之间,若新数据集最大最小值范围有变…

关于安装deepin+window10双系统有时没有声音的问题

关于安装deepinwindow10双系统有时没有声音的问题 这个问题小编目前还没有解决,求大神帮忙! deepin社区官网:深度科技社区 还可以参考一下其他的教程 深粉交流:新手刚刚安装好DEEPIN,但没有声音,怎而解决? 冰封飞飞(云网牛站):在Deepin系统中…

如何读H.264的标准和代码

首先,还是要弄清楚编解码的流程和 H.264 的关键技术,看白皮书就知道了,另外 H.264 综述类的文章和别人的学位论文一般也会讲到; 其次,弄清楚代码的各个函数实现的功能,这个可以看看 JM 代码里各个函数前面的…

Kafka官方文档翻译——实现

IMPLEMENTATION 1. API Design Producer APIs Producer API封装了底层两个Producer: kafka.producer.SyncProducerkafka.producer.async.AsyncProducerclass Producer {/* Sends the data, partitioned by key to the topic using either the *//* synchronous or t…

【机器学习】熵、决策树、随机森林 总结

一、熵 公式: −∑i1np(xi)∗log2p(xi)-\sum_{i 1}^{n}{p(xi)*log_2p(xi)}−i1∑n​p(xi)∗log2​p(xi) ∑i1np(xi)∗log21p(xi)\sum_{i1}^{n}p(xi)*log_2\frac{1}{p(xi)}i1∑n​p(xi)∗log2​p(xi)1​ import numpy as np# 账号是否真实:3no&#xff…

HDU 4857 逃生(拓扑排序)

拓扑排序 一.定义 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序&#xff0c;是将G中所有顶点排成一个线性序列&#xff0c;使得图中任意一对顶点u和v&#xff0c;若<u&#xff0c;v> ∈E(G)&#xff0c;则u在线性序列中出现在v之前。 通常&#xff0c;…

关于deepin系统安装design compiler的问题解答

关于deepin系统安装design compiler的问题解答 Design Compiler是Synopsys综合软件的核心产品。它提供约束驱动时序最优化&#xff0c;并支持众多的设计类型&#xff0c;把设计者的HDL描述综合成与工艺相关的门级设计&#xff1b;它能够从速度、面积和功耗等方面来优化组合电…

iOS 数据持久化-- FMDB

一、简介 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象&#xff0c;省去了很多麻烦、冗余的C语言代码 对比苹果自带的Core Data框架&#xff0c;更加轻量级和灵活 提供了多线程安全的数据库操作方法…

【机器学习】交叉验证筛选参数K值和weight

交叉验证 导包 import numpy as npfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn import datasets#model_selection &#xff1a;模型选择 # cross_val_score: 交叉 &#xff0c;validation&#xff1a;验证&#xff08;测试&#xff09; #交叉验证 from s…

jqGrid列的统计

$("#List").jqGrid({ url: "${pageContext.request.contextPath}/cbfx/getCbhzList.do", datatype: "json", mtype: GET, colNames:["成本类别","费用","去年同期费用","备注"], colMod…

手机只能签荣耀!最忠诚代言人胡歌喊你去天猫超品日

在你心中&#xff0c;男神胡歌是什么样子&#xff1f;“御剑乘风来&#xff0c;除魔天地间。”也许是《仙剑奇侠传》里飞扬跋扈、青春不羁的侠客李逍遥。“遍识天下英雄路&#xff0c;俯首江左有梅郎。”也许是《琅铘榜》中才智冠天下&#xff0c;远在江湖却名动帝辇的麒麟才子…

欧式距离与曼哈顿距离

欧式距离&#xff0c;其实就是应用勾股定理计算两个点的直线距离 二维空间的公式 其中&#xff0c; 为点与点之间的欧氏距离&#xff1b;为点到原点的欧氏距离。 三维空间的公式 n维空间的公式 曼哈顿距离&#xff0c;就是表示两个点在标准坐标系上的绝对轴距之和&#xff1a…

在maven pom.xml中加载不同的properties ,如localhost 和 dev master等jdbc.properties 中的链接不一样...

【参考】&#xff1a;maven pom.xml加载不同properties配置[转] 首先 看看效果&#xff1a; 点开我们项目中的Maven projects 后&#xff0c;会发现右侧 我们profile有个可勾选选项。默认勾选localhost。localhost对应项目启动后&#xff0c;会加载配置左侧localhost文件夹下面…

4.8-全栈Java笔记:包机制

包机制是java中管理类的重要手段。 开发中&#xff0c;我们会遇到大量同名的类&#xff0c;通过包我们很容易对解决类重名的问题&#xff0c;也可以实现对类的有效管理。 包对于类&#xff0c;相当于&#xff0c;文件夹对于文件的作用。package我们通过package实现对类的管理&a…

python安装以及版本检测

Windows 安装 Python 3 目前Python有两个大版本&#xff0c;分别是 2.X 和 3.X &#xff0c;我们的教程基于最新版本 3.6.1 首先我们需要获取Python的安装包&#xff0c;可以从官网获取&#xff0c;如果你因为没有VPN工具而无法访问官网的话&#xff0c;我已经将它放在网盘了&…

【机器学习】梯度下降原理

import numpy as np import matplotlib.pyplot as plt %matplotlib inlinef lambda x :(x-3)**22.5*x-7.5 f2 lambda x :-(x-3)**22.5*x-7.5求解导数 导数为0 取最小值 x np.linspace(-2,5,100) y f(x) plt.plot(x,y)梯度下降求最小值 #导数函数 d lambda x:2*(x-3)*12.…

C语言的面向对象设计-对X264/FFMPEG架构探讨

本文贡献给ZSVC开源社区&#xff08;https://sourceforge.net/projects/zsvc/&#xff09;&#xff0c;他们是来自于中国各高校的年轻学子&#xff0c;是满怀激情与梦想的人&#xff0c;他们将用自己的勤劳与智慧在世界开源软件领域为中国留下脚步&#xff0c;该社区提供大量视…

linux gtest安装

1. 安装cmake, 具体步骤这里不详说。 2. 下载源码&#xff1a;https://codeload.github.com/google/googletest/zip/release-1.8.0 3. 解压源码&#xff1a;unzip googletest-release-1.8.0.zip 4. 进入源码目录&#xff1a;cd googletest-release-1.8.0 5. 创建并进入目录buil…