【H264/AVC 句法和语义详解】(四):通过学习"描述子"实现码流解析的第一步

本篇隶属于文集:《H264/AVC 句法和语义详解》,查看文集全部文章,请点击文字链接。
想看最新文章,可以直接关注微信公众号:金架构

在这篇文章中,我们会涉及三个非常重要的问题:

1、如何获取一条主线和多条辅线,来学习h264解码器

2、为什么描述子,是正确打开码流解析的第一步

3、学习描述子

在前面几篇中,我们对h264的码流结构有了初步的了解。但是这还远远不够,因为我们的目标,是通过学习h264的解码流程,去探索h264里面的每个知识点。所以在这个时候,让读者明白我们现在身处的位置,是一件至关重要的事情。因为只有这样,我们才不会局限于某一篇文章,或某一个知识点,而是从全局考虑,为什么要这样做。

而且,我希望看我文章的读者,看完文章后获取的,不只是关于音视频的各个知识点。还有更重要的,那就是思考和自学的能力!在这篇文章结束时,无论新手还是有经验的同学,都可以从宏观出发,看出这个系列文章未来十篇的走势。并且我们还可以共同学习,一起研究。

1. 如何获取一条学习主线

在快餐文化盛行的今天,很多人都在学习零零碎碎的知识,却没有将各个知识点,形成一种互相联系的知识结构。就比如关于h264,很多人可能知道帧内预测、帧间预测、变换、量化、熵编码,但如果你问他一个h264编码器或解码器该怎么做,他可能就一头雾水。

所以这时候一条学习主线就非常重要,这是在你学习过程中,无论遇到什么困难,都能够把你拉回到问题本身,并让你知道现在所处位置的关键。

而在h.264里,这样的一条学习主线也非常重要,它就是h.264解码器框架!

1.1 学习主线:H.264解码器框架
H.264解码器框架

很多人并不会把流程图当成一回事,其实一个流程图,有可能是一篇文章、一个系列文章、书中一个章节或一本书的一个核心。

而根据上图,我们可以制定两个学习思路:

(1)根据如图所示流程,从最右侧码流开始,一步步各个击破,最终学完解码器各个知识点。

(2)编码器和解码器其实只是步骤相反罢了,一边学习解码器各个知识点,一边反过来思考,编码过程如何实现。

当然,我们还可以对上述路线进行分段,因为完整的一条学习主线,会包含一段段进阶路线。

1.2 学习主线分段

我个人是这样进行分段的:

学习主线分段

这样分段是有根据的,因为最开始我们手上有的,就是一个后缀为.h264的码流文件而已。所以我们首先要做的,就是先把句法元素解析出来。而如图所示,每一步我们需要学习的技术如下:

(1)h264句法元素的解析:NALU的结构和熵解码,同时熵解码又包括指数哥伦布编码、CAVLC、CABAC。只要掌握了NALU和熵解码,我们就可以从码流中解析出各个句法元素的值。即使我们完全是个小白,也可以按照h264协议完成这步。

(2)数据准备:DCT变换、量化、重排序,和它们相关的句法元素及语义。这个过程是为后面的重建图像做准备,这时我们已经解析出各个句法元素,实现该过程需要配合各步骤所需要的句法元素。

(3)重建图像:帧内预测、帧间预测、去块效应滤波器。这时候码流数据已经完全解压缩,就差拿着残差数据、参考图像和预测所需的句法元素,预测出预测数据。预测数据经过去块效应后即可得解码宏块,当前图像的所有宏块解码完成,就可以得到重建图像用于显示。

所以我们目前所处的位置,即将到达熵解码阶段。

2. 如何获取多条学习辅线

学习辅线这种事情,相当于知识点的各个击破,也相当于知识点的联系和延伸。我们可以一开始就设置多条辅线,而且在学的同时,还可以再设置辅线。就拿h264的解码学习来说,我们可以设置如下辅线:

(1)h.264 POC的计算

(2)h.264的加权预测

(3)h.264 FMO

(4)h.264参考图像列表

(5)加权预测

(6)量化

(7)帧内预测

(8)片、宏块之间的关系

(9)片类型与宏块类型

(10)NALU

(11)指数哥伦布编码

(12)熵编码

(13)YUV颜色空间

(14)残差

这些问题,可以是各个知识点,也可以是自己问自己的问题,它们的意义,在于在学习主线上,一路设置哨岗,相当于摸着石头过河。要知道学习新知识的重大突破,就是你得有石头可摸!

3. 为什么描述子是正确打开码流解析的第一步

为了要清楚的解释这个问题,我们得先知道什么是描述子?

3.1 什么是描述子?

还记得在NALU Header的解析中,我们说过,forbidden_zero_bit的值对应1个bit,nal_ref_idc的值对应2个bit,nal_unit_type的值对应5个bit。但是我没说,我是怎么知道哪个句法元素的值,对应几个bit的?或者说,我是怎么知道,句法元素的值是怎么计算的?

这就是描述子的作用,比如我们之前计算过的NALU Header的句法元素,它在h.264协议中规定如下:

NALU Header句法

右侧标红框的,就是各句法元素对应的描述子,它表示了,这个句法元素的值是如何计算的。其中f(1)、u(2)、u(5)功能一样,为顺序读取1、2和5个bit位,作为句法元素的值。所以我们才说,forbidden_zero_bit、nal_ref_idc、nal_unit_type的值,分别对应1、2、5个bit。

3.2 描述子种类

那是不是所有的语法元素都是以,连续读取接下来的n个比特这种模式来计算的呢?不是的,在h.264协议中,规定有如下描述子:

h.264协议规定的全部描述子

描述子乍一看很多,其实我们可以把它们分为三类:

(1)连续读取n(包含b(8))个比特:b(8)、f(n)、i(n)、u(n),其中只有i(n)为有符号整数,并且几乎用不到,其他情况则顺序从左至右,读取固定数量的n个bit即可。如上面所讲的NALU Header的句法元素

(2)指数哥伦布编码:ue(v)、me(v)、se(v)、te(v),这四个描述子,都是指数哥伦布编码。注意到它们使用的变量是v而不是n,它们的值,并不是直接等于读取固定长度的比特。而是先根据其他句法元素的值,来确定读取多少比特,然后再将读取到的比特,进行转换才能得到所求句法元素的值。

关于它们,我们后面会单独开几篇来介绍。

(3)CAVLC、CABAC:ae(v)、ce(v),同指数哥伦布编码一样,CAVLC和CABAC也属于变长编码,这也是我们需要学习的一大重点。

3.3 利用描述子解析句法元素

所以这时,只要我们懂得,各个描述子是如何计算的,我们就能根据它们解析出句法元素的值。不过需要注意的是,有时候我们会看到这种情况:

句法元素对应两个描述子的情况

可以看到,在解析宏块层mb_type的时候,该句法元素对应了两个描述子,分别为ue(v)和ae(v),并且它们之间用竖线 “|” 分隔开。

H.264协议规定,出现这种情况,得根据另一句法元素entropy_coding_mode_flag 的值来判断:

如果entropy_coding_mode_flag等于0,则使用左边的描述子,这时为ue(v)。

如果entropy_coding_mode_flag等于1,则使用右边的描述子,这时为ae(v)。

3.4 为什么描述子是正确打开码流解析的第一步

这个时候,我们就可以来回答最开始这个问题了。

如1.2学习主线分段所说,我们如果要进行码流解析,第一步则是进行句法元素的解析,而句法元素的解析,又依赖于刚才所讲的那几种描述子。通过刚才的学习我们也知道,学习描述子,其实就相当于学习熵编码。

所以我们接下来,就从学习描述子开始。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容