胖头猫游戏提供热门游戏下载和手游攻略!

H264学习1手册NAL单元

发布时间:2024-10-16浏览:49

大家好,关于H264学习1手册NAL单元很多朋友都还不太明白,今天小编就来为大家分享关于的知识,希望对各位有所帮助!

1.文件结构

H264的源文件由NAL单元组成。一个完整的NAL数据由三部分组成:起始码前缀、NAL头和RBSP。

起始码前缀为:0X00 0X00 0X00 0X01,由四个连续字符组成。

NAL 标头由一个字节组成:

bit[7]固定为0,即必须为0,表示:forbidden_zero_bit

位[6:5]:表示:nal_ref_idc

bit[4:0]:表示NAL单元的类型,nal_unit_type

剩下的部分是整个文件RBSP的主题部分

2.准备工作

这里需要提一下的是,在分析H264文件数据时,一般都是以比特流的形式来分析数据。除了常见的整数数据类型外,还有哥伦比亚索引编码。还需要将NAL单元中除起始码前缀和NAL头之外的数据转换为RBSP格式。

2.1 哥伦比亚指数编码分析

2.1.1 哥伦比亚指数编码无符号数的解码

(1) 首先读取当前位置的位,记录连续0的个数N。

(2) 如果连续0 的个数为0,则值为0。如果连续0 的个数不为0,则跳过第一个非0 位。

(3) 再次读取N条数据,这条数据以无符号形式num解析

(4)num=num-1+2的N次方

2.1.2 哥伦比亚指数编码有符号数的解码

(1)根据2.1.1中的描述,首先获取该数据的Columbia索引编码的无符号形式。

(2)如果数据为奇数num=(num+1)/2;如果是偶数num=-(num/2)

2.2 将NAL数据转换为RBSP数据

其实这部分需要做的就是去掉NAL单元中除头部之外的数据,去掉连续两个0x00数据后的0x03数据。

3.手动解析

目前获取的源数据为:

00 00 00 01 67 64 00 0C

交流D9 41 41 FB 01 10 00

00 03 00 10 00 00 03 01

E0 F1 42 99 60

NAL头中的数据为0x67(0110 0111),因此forbidden_zero_bit(0)的值为0,nal_ref_idc(11)的值为(3),nal_unit_type(00111)的值为7,这意味着下面的RBSP数据是参数序列集。

将以下数据转换为RBSP格式数据为:

64 00 0

交流D9 41 41 FB 01 10 00

00 00 10 00 00 01

E0 F1 42 99 60

解析参数序列集的流程如下图所示

描述符列代表此处数据的类型。 f和u表示无符号数据类型,ue表示哥伦比亚索引编码的无符号数据,se表示哥伦比亚索引编码的有符号数据。

0x67

procfile:占用8位。当前使用的字符是0x67。数据类型是无符号的,因此值为100。

0x00

constraint_set0_flag0:占用1位,当前使用的字符为0x0,二进制状态为0000 0000,数据类型为无符号,所以值为0;

constraint_set0_flag1:占用1位,当前使用的字符为0x0,二进制状态为000 0000,数据类型为无符号,所以值为0;

constraint_set0_flag2:占用1位,当前使用的字符为0x0,二进制状态为00 0000,数据类型为无符号,所以值为0;

constraint_set0_flag3:占用1位,当前使用的字符为0x0,二进制状态为0 0000,数据类型为无符号,所以值为0;

constraint_set0_flag4:占用4位,当前使用的字符为0x0,二进制状态为0000,数据类型为无符号,所以值为0;

0x0C

level_idc:占用8位,当前使用的字符为0x0c。数据类型是无符号的,因此值为12。

0xAC

seq_parameter_set_id: 使用由哥伦比亚指数编码的无符号数。二进制状态为1010 1100,连续0的个数为0,占用1位数据,所以值为0。

由于procfile 的值为100

chroma_format_idc:采用哥伦比亚索引编码无符号数,二进制状态010 1100,连续0的个数为1,占用3位数据,因此值为1(0+2-1)。

bit_depth_luma_minus8:使用哥伦比亚指数编码的无符号数,二进制状态为1100,连续0的个数为0,占用1位数据,因此值为0。

bit_depth_chroma_minus8: 使用由哥伦比亚指数编码的无符号数。二进制状态为100,连续0的个数为0,占用1位数据,所以值为0。

qpprime_y_zero_transform_bypass_flag:占用1位,当前使用的字符为0xAC,二进制状态为00,数据类型为无符号,所以值为0;

seq_scaling_matrix_present_flag: 占用1位,当前使用的字符为0xAC,二进制状态为0,数据类型为无符号,所以值为0;

0xD9

log2_max_frame_num_minus4: 是用哥伦比亚指数编码的无符号数。二进制状态为1101 1001,连续0的个数为0,占用1位数据,所以值为0。

pic_order_cnt_type: 使用由哥伦比亚指数编码的无符号数。二进制状态为101 1001,连续0的个数为0,占用1位数据,所以值为0。

log2_max_pic_order_cnt_lsb_minus4: 使用由哥伦比亚指数编码的无符号数。二进制状态为01 1001,连续0的个数为1,占用3位数据,所以值为2。

0X41

num_ref_frames: 是用哥伦比亚指数编码的无符号数。二进制状态为001 0100 0001,连续0的个数为2,占用5位数据,所以值为4。

gaps_in_frame_num_value_allowed_flag 0: 占用1位,当前使用的字符为0x41,二进制状态为00 0001,数据类型为无符号,因此值为0;

0X41

pic_width_in_mbs_minus1: 是用哥伦比亚指数编码的无符号数。二进制状态为0 0001 0100 0001。连续0的个数为4个,占用9位数据,所以值为19。

0XFB

pic_height_in_map_units_minus1: 是用哥伦比亚指数编码的无符号数。二进制状态为0001 1111 1011。连续0的个数为3个,占用7位数据,因此值为14。

frame_mbs_only_flag: 占用1 位,当前使用的字符为0xFB,二进制状态为1 1011,数据类型为无符号,所以值为1;

direct_8x8_inference_flag: 占用1位,当前使用的字符为0xFB,二进制状态为1011,数据类型为无符号,因此值为1;

frame_cropping_flag: 占用1位,当前使用的字符为0xFB,二进制状态为011,数据类型为无符号,所以值为0;

vui_parameters_present_flag: 占用1位,当前使用的字符为0xFB,二进制状态为11,数据类型为无符号,因此值为1;

spect_ratio_info_present_flag: 占用1位,当前使用的字符为0xFB,二进制状态为1,数据类型为无符号,所以值为1;

0X01

spect_ratio_idc: 占用8 位,当前使用的字符为0x01,二进制状态为0000 0001。数据类型为无符号类型,因此值为1;

0x10

overscan_info_present_flag: 占用1位,当前使用的字符为0x01,二进制状态为0001 0000。数据类型为无符号类型,因此值为0;

video_signal_type_present_flag: 占用1位,当前使用的字符为0x01,二进制状态为001 0000。数据类型为无符号类型,因此值为0;

chroma_loc_info_present_flag: 占用1位,当前使用的字符为0x01,二进制状态为01 0000。数据类型为无符号类型,因此值为0;

timing_info_present_flag: 占用1 位,当前使用的字符为0x01,二进制状态为1 0000,数据类型为无符号,因此值为1;

0X00 0X00 0X00 0X10

num_units_in_tick: 占用32 位。当前使用的字符是0x0 0X00 0X00 0X00 0X10。二进制状态为0000 0000 0000 0000 0000 0000 0000 0001。数据类型为无符号类型,所以值为1;

0X00 0X00 0X01 0XE0

time_scale: 占用32 位,当前使用的字符为0x0 0X00 0X00 0X01 0XE0,二进制状态为0000 0000 0000 0000 0000 0001 1110 0000。数据类型为无符号类型,因此值为30;

0XE0

fixed_frame_rate_flag: 占用1位,当前使用的字符为0xe0,二进制状态为0000,数据类型为无符号,所以值为0;

nal_hrd_parameters_present_flag : 占用1位,当前使用的字符为0xe0,二进制状态为000,数据类型为无符号,所以值为0;

vcl_hrd_parameters_present_flag: 占用1位,当前使用的字符为0xe0,二进制状态为00,数据类型为无符号,所以值为0;

pic_struct_present_flag: 占用1位,当前使用的字符为0xe0,二进制状态为0,数据类型为无符号,所以值为0;

0XF1

bitstream_restriction_flag: 占用1 位,当前使用的字符为0xF1,二进制状态为1111 0001。数据类型为无符号类型,因此值为1;

Motion_vectors_over_pic_boundaries_flag: 占用1 位,当前使用的字符为0xF1,二进制状态为111 0001。数据类型为无符号类型,因此值为1;

max_bytes_per_pic_denom: 使用由哥伦比亚指数编码的无符号数。二进制状态为11 0001,连续0的个数为1,占用1位数据,所以值为0。

max_bits_per_mb_denom: 使用由哥伦比亚指数编码的无符号数。二进制状态为1 0001,连续0的个数为1,占用1位数据,所以值为0。

0X42

log2_max_mv_length_horizontal: 使用由哥伦比亚指数编码的无符号数。二进制状态为0001 0100 0010,连续0的个数为3个,占用7位数据,所以值为9。

0X99

log2_max_mv_length_vertical: 使用由哥伦比亚指数编码的无符号数。二进制状态为0 0010 1001 1001。连续0的个数为3个,占用7位数据,所以值为9。

num_reorder_frames: 使用由哥伦比亚指数编码的无符号数。二进制状态为01 1001,连续0的个数为1,占用3位数据,所以值为2。

0x60

max_dec_frame_buffering:使用哥伦比亚指数编码的无符号数,二进制状态为001 0110 0000,连续0的个数为2,占用5位数据,因此值为4。

rbsp_stop_one_bit: 占用1位,当前使用的字符为0x60,二进制状态为10 0000,数据类型为无符号,所以值为1;

满足完整的RBSP结构。

对比elecard流分析工具得到的结果,结果是一致的。

用户评论

几妆痕

刚开了一个视频编码相关的课程,老师推荐这篇文章来入门 H264,正好我今天打算学习一下,所以来看一看。希望能够看懂这篇讲解 NAL 单元的方法!

    有12位网友表示赞同!

肆忌

讲的挺详细的啊,看明白了NAL单元的结构和每个类型的含义,感觉像解开了视频编码的一道难题,很有成就感!现在就能理解一些 H.264 的基本概念了。

    有10位网友表示赞同!

空巷

看完这篇文章我脑袋炸了一点,不过还是要感谢作者把这种抽象的概念用代码和图表来解释得很清楚,让我能够稍微了解一点 H264 的工作原理。期待下期文章继续讲解解码过程!

    有5位网友表示赞同!

爱你的小笨蛋

我也正在学习视频编码,发现 NAL 单元确实是一个关键概念!这篇文章的分析非常详细,甚至包含了例子和代码,简直是入门 H264 的最佳指南!感谢作者分享!

    有11位网友表示赞同!

折木

我最近在研究视频解码,看到这篇关于NAL单元的文章就想来了解一下编码过程,虽然有些难懂,但我还是坚持看下去。希望能学到更多 H.264 的相关知识!

    有7位网友表示赞同!

|赤;焰﹏゛

说实话,刚开始看这篇文章的时候还是有点懵的,因为这些定义和概念对我来说太陌生了。不过看着作者一步一步的讲解,逐渐明白了一些思路,很有启发性!学习视频编码确实需要多花点时间。

    有7位网友表示赞同!

轨迹!

文章结构很清晰,图表也很直观易懂,一下子就明白了NAL单元的构成和功能。看来要理解 H.264 真的需要从最基本的概念入手!希望以后还能看到更多关于视频编码的教程!

    有12位网友表示赞同!

枫无痕

对于想要深入学习 H264 编码来说,这份手解分析相当不错!作者把 NAL 单元拆解得很详细,能够帮助读者真正理解它的工作机制。值得每一份学习视频编码的人都收藏起来!

    有10位网友表示赞同!

青衫负雪

感觉很多文章都是停留在概念层面讲解,这本书却很好的用实际案例和代码来讲解 NAL单元的机制,这让我对 H264 的实现有了更清晰的认识!

    有13位网友表示赞同!

◆乱世梦红颜

这段分析确实很专业!虽然理解起来有点困难,但我相信多看几遍就能完全掌握。H264 的技术真是越来越高级了,需要好好学习才能跟上节奏!

    有5位网友表示赞同!

眷恋

NAL单元的设计确实很巧妙,能够把视频划分成不同的块进行编码,提高了效率!这篇文章分析的很透彻,让我对 H264 整体架构有了更全面的了解。

    有12位网友表示赞同!

心悸╰つ

感觉这篇文章写的有点太深入,对于初学者来说可能容易理解不了。不过我还是希望看到更多这种水平的讲解,才能真正提升自己!

    有15位网友表示赞同!

不要冷战i

我一直在研究视频压缩算法,觉得 H264 非常强大! 这篇文章对 NAL单元的解释很细致,让我更深入地了解了它的工作原理,十分感谢作者!

    有9位网友表示赞同!

来瓶年的冰泉

这个解析NAL单元的文章写的太棒了,帮我彻底搞清了这个关键概念!H264 真的是一个神奇的压缩算法,希望以后能够自己动手编写解码器!

    有10位网友表示赞同!

尘埃落定

想学习 H.264 编码,这篇文章绝对是一份宝贵的资料!把 NAL单元解释得通俗易懂,真棒!

    有12位网友表示赞同!

此刻不是了i

感谢作者分享这篇如此详细的教程!NAL单元是一个重要的概念,理解它对我今后研究视频编码非常有帮助!

    有9位网友表示赞同!

哽咽

文章分析到位,图表清晰易懂。对于想要学习 H264 编码的人来说,这是一份宝贵的资源!

    有20位网友表示赞同!

热点资讯