`
jubincn
  • 浏览: 242548 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多
原文:bbs.chinavideo.org/viewthread.php?tid=4164

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

首先,还是要弄清楚编解码的流程和 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 解码时候该变量的值是多少……多做几个观察值,注意不要选择特殊位置,然后总结一下规律,这样你就自然能分析出该变量的作用和含义了。

以上讲的是解码过程,编码过程就是解码的反过程,因此同理。

分享到:
评论

相关推荐

    H.264学习指南(学习方法介绍;学习资源获取;如何读标准和代码)

    网上收集来的h.264的学习指南,包括学习建议、学习资源和如何读标准和代码,相信对h.264的学习者,尤其是初学者会有帮助

    H.264学习指南.rar

    1. **如何读标准和代码.txt**:学习H.264,首先需要理解其官方标准文档,通常由ITU-T的Recommendation H.264和ISO/IEC的14496-10组成。这份文件可能涵盖了如何阅读这些技术规范,包括理解宏块、预测模式、熵编码等...

    matlab开发-H264比较基准编解码器读取和写入视频

    Abdullah al-Muhit博士的H.264基线编解码器是H264实现的一个参考模型,提供了基本的编码和解码功能。使用MATLAB来开发这样的编解码器,可以利用其强大的数值计算能力和便捷的矩阵操作,同时MATLAB的可视化特性也有助...

    如何读标准和JM代码

    标题与描述概述的知识点主要集中在理解H.264编码标准和JM模型代码上,具体而言,这涉及到了H.264视频压缩标准的基本原理、JM(Joint Model)参考软件的理解,以及如何解析H.264视频流中的关键元素——NALU(Network ...

    h264h265_export.zip

    标题 "h264h265_export.zip" 提供的是一个包含Wireshark插件的压缩包,用于导出H.264和H.265...为了充分利用这个插件,用户需要了解Wireshark的基本操作,熟悉H.264和H.265编码技术,并能读懂"使用说明.txt"中的指示。

    C++ 解析H264文件

    在IT领域,尤其是在多媒体处理和视频编码中,H264是一种广泛应用的高效视频编码标准。C++作为一种强大的编程语言,被广泛用于开发复杂的软件系统,包括视频处理和解析。本篇将深入探讨如何使用C++解析H264文件。 ...

    H264SpsAnalysis.rar

    "参考JM8.6的代码移植作为解析sps头和pps头"这部分描述表明,这个压缩包可能包含了一段基于JVT-M086(即JPEG-MPEG联合工作组的第八次版本第六次修订版)实现的代码,该版本是H.264/AVC标准的一个实现参考模型。...

    H.264 Java Encoder-开源

    H.264,全称是MPEG-4 Part 10或Advanced Video Coding(高级视频编码),是目前广泛应用的高效视频编码标准之一。它以其出色的压缩效率和广泛的设备支持,被众多开发者和企业所青睐。本文将深入探讨一个用Java语言...

    JM代码阅读笔记共5篇

    这篇文章集主要关注的是对JM代码的解读,JM是JVT(Joint Video Team)开发的H.264/AVC参考软件,它是学习和理解H.264编码标准的重要资源。H.264,又称为AVC(Advanced Video Coding),是一种高效能的视频压缩标准,...

    读取h264文件并发送为RTP码流

    在IT行业中,网络视频传输是不可或缺的一部分,而RTP(Real-time Transport Protocol)协议和H264编码标准则是其中的关键技术。本文将详细讲解如何读取H264文件并将其转换为RTP码流进行传输。 首先,我们要了解H264...

    c标准库

    通过学习《C标准库》第七章,程序员可以熟悉<math.h>库中的各种函数,理解如何在C语言程序中进行科学计算和数值分析。这有助于编写更加健壮和高效的代码,特别是在需要处理数值运算的场合,如工程计算、数据分析等...

    VC6实现读取H264格式文件

    总之,通过VC6实现H264文件读取涉及到对编码标准的深入理解,选择合适的解码库,以及编写解析和解码代码。尽管这个任务在现代开发环境中可能相对简单,但在VC6中实现可能需要更多工作。附带的"ReadH264File"工程代码...

    live555通过读取内存发送h264视频

    H264,也称为AVC(Advanced Video Coding),是一种高效能的视频编码标准,具有高压缩率和高图像质量的特点,广泛应用于网络视频传输、视频会议、监控系统等领域。在内存中处理H264视频数据,可以避免不必要的磁盘I/...

    C 代码 返回挂钟时间的读数.rar

    标题 "C 代码 返回挂钟时间的读数.rar" 暗示了这是一个与C语言编程相关的项目,其中包含了获取系统挂钟时间的代码。挂钟时间通常指的是计算机自启动以来经过的时间,不同于我们日常生活中的日期和时间,而是用于测量...

    gzip-1.3.12.tar.gz源代码

    此外,头文件(.h)提供函数声明和数据结构定义,如`gzip.h`,`stdio.h`,`sys/types.h`等,它们定义了接口和编译时依赖项。 3. **命令行选项处理**:gzip支持多种命令行选项,如 `-d`(解压缩)、`-l`(列出压缩...

    指南针类_src.zip源代码

    9. **代码组织**:遵循良好的编码规范和设计模式(如SOLID原则)可以使代码更易读、易维护。良好的注释也是源代码质量的重要体现。 10. **单元测试**:对于复杂的功能,可能有对应的单元测试代码,确保每个部分的...

    电子-C标准库源代码.zip

    这个名为"电子-C标准库源代码.zip"的压缩包文件包含的是C标准库的源代码,对于深入理解和学习C语言,以及计算机科学的基本原理具有极大的价值。 C标准库主要由ISO/IEC 9899标准定义,通常被称为C99或C11标准,这些...

    Cambricon-CNCodec-Developer-Guide-CN-v1.10.0.pdf

    - 编码功能同样广泛,包括不同类型的输入格式和码流规格,同时提供了H.265、H.264和JPEG的编码特性,以实现高质量和高效的编码输出。 - 缩放和格式转换功能允许开发者灵活地处理不同分辨率和颜色空间的图像,以...

    C标准库源代码.rar

    这个名为"C标准库源代码.rar"的压缩包文件包含的是一系列C标准库的源代码,这对于理解C语言底层运作机制、学习如何实现标准库功能以及进行低级系统编程具有重要意义。 C标准库主要依据C99和C11标准,其中包含多个...

Global site tag (gtag.js) - Google Analytics