Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2588
  • 博文数量: 4
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 30
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-17 01:12
文章分类
文章存档

2021年(4)

我的朋友
最近访客

分类: C/C++

2021-10-12 10:15:14

简单说说编码

当我们把摄像头采集画面直接写入到文件中时,我们会发现没一会文件已经非常大了。这导致很不适合保存和传输,所以需要编码,把画面数据进行压缩。视频编码标准有很多,而我们这里讲的是H.264编码。其他请看:视频编码标准汇总及比较

H.264编码

制订H.264的主要目标有两个:
(1)视频编码层(VCL,全称:Video Coding Layer):得到高的视频压缩比。
(2)网络提取层(NAL,全称:Network Abstraction Layer):具有良好的网络亲和性,即可适用于各种传输网络。而NAL则是以NALU(NAL Unit)为单元来支持编码数据在基于包交换技术网络中传输的。

编码的输入与输出

一张张画面通过以H.264编码标准的编码器(如x264)编码后,输出一段包含N个NALU的数据,每个NALU之间通过起始码来分隔,如图:

  • 起始码: 0x00 00 01 或者 0x00 00 00 01。

在网络传输(如RTMP)或者一些容器中(如FLV),通常会把NALU整合到视频区域的数据中。如下图的flv格式:


所以这篇文章主要学习NALU的基本知识,学会如何去分析一段NALU数据。

NALU(NAL 单元)

NALU(NAL Unit,NAL 单元)的组成部分如下图。其中,f(0)占1bit,u(2)占2bit,u(5)占5bit,文中如有出现类似描述符请看。


从上图可以看出来,当前NAL单元属于什么样的类型,这取决于RBSP具体是什么样的类型,而RBSP的类型是根据nal_unit_type的值来定义的。
①当nal_unit_type为1~5时:RBSP为切片类型(有5种切片类型);整个NAL单元类型为VCL NAL单元,VCL是上面说的视频编码层,里面有编码后画面数据。
②当nal_unit_type为其他时:RBSP为序列参数集类型、图像参数集类型等等;整个NAL单元类型为非VCL NAL单元。
具体的nal_unit_type所对应的RBSP类型如下表所示:

nal_unit_type NAL 单元和 RBSP 语法结构的内容
0 未指定
1 一个非IDR图像的编码条带
slice_layer_without_partitioning_rbsp( )
2 编码条带数据分割块A
slice_data_partition_a_layer_rbsp( )
3 编码条带数据分割块B
slice_data_partition_b_layer_rbsp( )
4 编码条带数据分割块C
slice_data_partition_c_layer_rbsp( )
5 IDR图像的编码条带
slice_layer_without_partitioning_rbsp( )
6 辅助增强信息 (SEI)
sei_rbsp( )
7 序列参数集(SPS)
seq_parameter_set_rbsp( )
8 图像参数集(PPS)
pic_parameter_set_rbsp( )
9 访问单元分隔符
access_unit_delimiter_rbsp( )
10 序列结尾
end_of_seq_rbsp( )
11 流结尾
end_of_stream_rbsp( )
12 填充数据
filler_data_rbsp( )
13 序列参数集扩展
seq_parameter_set_extension_rbsp( )
14…18 保留
19 未分割的辅助编码图像的编码条带
slice_layer_without_partitioning_rbsp( )
20…23 保留
24…31 未指定

SPS(序列参数集)

SPS全称 Sequence parameter set(序列参数集),当nal_unit_type=7时,RBSP就是SPS类型,也可以说NAL单元为SPS的NAL单元。SPS主要包含的是针对一连续编码视频序列的参数,如帧数、图像尺寸等;详见下表 序列参数集RBSP 语法



上面中的主要参数的含义:

  • profile_idc 档次(H.264编码标准有几个档次):66=基本;77=主要;88=扩展…
  • seq_parameter_set_id 标识符,本序列的id号,会被PPS引用。
  • num_ref_frames 指定参考帧队列可能达到的最大长度。
  • pic_width_in_mbs_minus1 加1是指以宏块为单元的每个解码图像的宽度。
  • pic_height_in_map_units_minus1 加1表示以条带组映射为单位的一个解码帧或场的高度。

下面为从一个只放h.264视频编码文件的一段(SPS):


ue(v)和se(v)的计算公式见 。

点击(此处)折叠或打开

  1. # 00000001 6764001E ACD940A0 2FF96100 00030001 00000300 320F162D 96
  2. 00000001 #起始码
  3. #NAL单元头---0x67 0110 0111 --------------
  4. 0... .... # forbidden_zero_bit -->u(1)
  5. .11. .... # nal_ref_idc -->u(2) -->HIGHEST
  6. ...0 0111 # nal_unit_type -->u(5) -->SPS
  7. 64 # profile_idc=103 -->u(8)
  8. #---0x00 0000 0000 --------------
  9. 0... .... #constraint_set0_flag
  10. .0.. .... #constraint_set1_flag
  11. ..0. .... #constraint_set2_flag
  12. ...0 .... #constraint_set3_flag
  13. .... 0000 #reserved_zero_4bits
  14. 1E # level_idc -->u(8) --> 30
  15. #-----------0xAC 1010 1100 --------------
  16. 1... .... # seq_parameter_set_id --> ue(v) --> 0
  17. .010 .... # log2_max_frame_num_minus4 --> ue(v) --> 1
  18. .... 1... # pic_order_cnt_type --> ue(v) -->1 执行else if( pic_order_cnt_type == 1 )
  19. .... .1..#delta_pic_order_always_zero_flag -->u(1)
  20. #----------0xACD9 (1010 11)00 1101 1001 ====== 括号里面的bit上面已使用
  21. .... ..00 110. .... #offset_for_non_ref_pic -->se(v)->codeNum=5->value=3
  22. .... .... ...1 .... #offset_for_top_to_bottom_field -->se(v)->codeNum=0->value=0
  23. .... .... .... 1... #num_ref_frames_in_pic_order_cnt_cycle -->ue(v)->0
  24. #----------0xD940 (1101 1)001 0100 0000 ====== 括号里面的bit上面已使用
  25. .... .001 01.. .... #num_ref_frames -->ue(v)->4
  26. .... .... ..0. .... #gaps_in_frame_num_value_allowed_flag -->u(1)->0
  27. #----------0x40A0 (010)0 0000 1010 0000 ====== 括号里面的bit上面已使用
  28. ...0 0000 1010 00.. #pic_width_in_mbs_minus1 -->ue(v)->32-1+8=39
  29. #----------0xA02F (1010 00)00 0010 1111 ====== 括号里面的bit上面已使用
  30. .... ..00 0010 111. #pic_height_in_map_units_minus1 -->ue(v)->16-1+7=22

PPS(图像参数集)

PPS全称picture parameter set(图像参数集),当nal_unit_type=8时,RBSP就是PPS类型,也可以说NAL单元为SPS的NAL单元。一个序列中某一幅图像或者某几幅图像,其参数如标识符pic_parameter_set_id、可选的seq_parameter_set_id、熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等;详见下表 图像参数集RBSP 语法



阅读(448) | 评论(0) | 转发(0) |
0

上一篇:直播推流全过程:音频数据源之PCM(2)

下一篇:没有了

给主人留下些什么吧!~~