所谓参考帧,就是在其他帧解码时需要参照的帧。比如一个I帧可能被一个或多个B帧参考,一个B帧可能被某个P帧参考。
从这个表我们也可以看出来,DIR的I帧是非常重要的,它一丢,那么这个序列的所有帧都没办法解码了;序列参数集和图像参数集也很重要,没有序列参数集,这个序列的帧就没法解;没有图像参数集,那用到这个图像参数集的帧都没法解。
③ nal_unit_type:NALU类型取值如下表所示:
Nal_unit_type NAL类型 C
0 未使用
1 非IDR图像中不采用数据划分的片段 2,3,4
2 非IDR图像中A类数据划分片段 2
3 非IDR图像中B类数据划分片段 3
4 非IDR图像中C类数据划分片段 4
5 IDR图像的片 2,3
6 补充增强信息单元(SEI) 5
7 序列参数集 0
8 图像参数集 1
9 分界符 6
10 序列结束 7
11 码流结束 8
12 填充 9
13…23 保留
24…31 不保留(RTP打包时会用到)
RTP打包时的扩展类型
24 STAP-A Single-time aggregation packet
25 STAP-B Single-time aggregation packet
26 MTAP16 Multi-time aggregation packet
27 MTAP24 Multi-time aggregation packet
28 FU-A Fragmentation unit
29 FU-B Fragmentation unit
30-31 undefined
NALU的顺序要求:
H.264/AVC标准对送到解码器的NAL单元顺序是有严格要求的,如果NAL单元的顺序是混乱的,必须将其重新依照规范组织后送入解码器,否则解码器不能够正确解码。
1)序列参数集NAL单元
必须在传送所有以此参数集为参考的其他NAL单元之前传送,不过允许这些NAL单元中间出现重复的序列参数集NAL单元。
所谓重复的详细解释为:序列参数集NAL单元都有其专门的标识,如果两个序列参数集NAL单元的标识相同,就可以认为后一个只不过是前一个的拷贝,而非新的序列参数集。
2)图像参数集NAL单元
必须在所有以此参数集为参考的其他NAL单元之前传送,不过允许这些NAL单元中间出现重复的图像参数集NAL单元,这一点与上述的序列参数集NAL单元是相同的。
3)不同基本编码图像中的片段(slice)单元和数据划分片段(data partition)单元在顺序上不可以相互交叉,即不允许属于某一基本编码图像的一系列片段(slice)单元和数据划分片段(data partition)单元中忽然出现另一个基本编码图像的片段(slice)单元片段和数据划分片段(data partition)单元。
4)参考图像的影响:如果一幅图像以另一幅图像为参考,则属于前者的所有片段(slice)单元和数据划分片段(data partition)单元必须在属于后者的片段和数据划分片段之后,无论是基本编码图像还是冗余编码图像都必须遵守这个规则。
5)基本编码图像的所有片段(slice)单元和数据划分片段(data partition)单元必须在属于相应冗余编码图像的片段(slice)单元和数据划分片段(data partition)单元之前。
6)如果数据流中出现了连续的无参考基本编码图像,则图像序号小的在前面。
7)如果arbitrary_slice_order_allowed_flag置为1,一个基本编码图像中的片段(slice)单元和数据划分片段(data partition)单元的顺序是任意的,如果arbitrary_slice_order_allowed_flag置为零,则要按照片段中第一个宏块的位置来确定片段的顺序,若使用数据划分,则A类数据划分片段在B类数据划分片段之前,B类数据划分片段在C类数据划分片段之前,而且对应不同片段的数据划分片段不能相互交叉,也不能与没有数据划分的片段相互交叉。
8)如果存在SEI(补充增强信息)单元的话,它必须在它所对应的基本编码图像的片段(slice)单元和数据划分片段(data partition)单元之前,并同时必须紧接在上一个基本编码图像的所有片段(slice)单元和数据划分片段(data partition)单元后边。假如SEI属于多个基本编码图像,其顺序仅以第一个基本编码图像为参照。
9)如果存在图像分割符的话,它必须在所有SEI 单元、基本编码图像的所有片段slice)单元和数据划分片段(data partition)单元之前,并且紧接着上一个基本编码图像那些NAL单元。
10)如果存在序列结束符,且序列结束符后还有图像,则该图像必须是IDR(即时解码器刷新)图像。序列结束符的位置应当在属于这个IDR图像的分割符、SEI 单元等数据之前,且紧接着前面那些图像的NAL单元。如果序列结束符后没有图像了,那么它的就在比特流中所有图像数据之后。
11)流结束符在比特流中的最后。
(2)RBSP
RBSP数据是下表中的一种:
RBSP类型 缩写 描述
参数集 PS 序列的全局信息,如图像尺寸、视频格式等
增强信息 SEI 视频序列解码的增强信息
图像界定符 PD 视频图像的边界
编码片 SLICE 编码片的头信息和数据
数据分割 DP片层的数据,用语错误恢复解码
序列结束符 表明一个序列的结束,下一个图像为IDR图像
流结束符 表明该流中已没有图像
填充数据 亚元数据,用于填充字节
从前面的分析我们知道,VCL层出来的是编码完的视频帧数据,这些帧可能是I、B、P帧,而且这些帧可能属于不同的序列,再者同一个序列还有相对应的一套序列参数集和图片参数集等等,所以要完成视频的解码,不仅需要传输VCL层编码出来的视频帧数据,还需要传输序列参数集、图像参数集等数据。
参数集:包括序列参数集 SPS和图像参数集 PPS。SPS包含的是针对一连续编码视频序列的参数,如标识符 seq_parameter_set_id、帧数及 POC 的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等等。PPS对应的是一个序列中某一幅图像或者某几幅图像,其参数如标识符 pic_parameter_set_id、可选的 seq_parameter_set_id、熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等等。
数据分割:组成片的编码数据存放在3个独立的DP(数据分割,A、B、C)中,各自包含一个编码片的子集。分割A包含片头和片中每个宏块头数据。分割B包含帧内和 SI 片宏块的编码残差数据。分割 C包含帧间宏块的编码残差数据。每个分割可放在独立的 NAL 单元并独立传输。
3.2.4.H.264封装模式
H.264有两种封装模式:
(1)annexb模式:传统模式,有start code, SPS和PPS是在ES中;
(2)mp4模式:没有start code,SPS和PPS是封装在container中,每一个frame前面是这个frame的长度;SPS的头部是0x67,PPS的头部是0x68,要保持对数据的敏感性。
4.VC-1编码技术
VC-1即Video Codec One(视频解码方案一)。它起源于微软公司的Windows Media Video 9。VC-1是继MPEG-2 TS和H.264之后,最后被认可的高清编码标准格式。VC-1虽然是最后被认可的高清编码格式,不过因为有微软的后台,所以这种编码格式不能小窥。相对于MPEG2,VC-1的压缩比更高,但相对于H.264而言,编码解码的计算则要稍小一些。
总的来说,从压缩比上来看,H.264的压缩比率更高一些,也就是同样的视频,通过H.264编码算法压出来的视频容量要比VC-1的更小,但是VC-1格式的视频在解码计算方面则更小一些,一般通过高性能的CPU就可以很流畅的观看高清视频。目前来看,VC-1可能是一个比较好的平衡,辅以微软的支持,应该是一只不可忽视的力量。一般来说,VC-1多为 “.wmv”后缀,但这都不是绝对的,具体的编码格式还是要通过软件来查询。
5.WMV编码技术
WMV(Windows Media Video)是微软开发的一系列视频编解码和其相关的视频编码格式的统称,是微软Windows媒体框架的一部分。WMV包含三种不同的编解码:作为RealVideo的竞争对手,最初为Internet上的流应用而设计开发的WMV原始的视频压缩技术;另一种是为满足特定内容需要的WMV屏幕和WMV图像的压缩技术;在经过SMPTE(Society of Motion Picture and Television Engineers)学会标准化以后,WMV版本9被采纳作为物理介质的发布格式,比如高清DVD和蓝光光碟,即所谓的VC-1。
微软也开发了一种称之为ASF(Advanced Systems Format)的数字容器格式,用来保存WMV的视频编码。在同等视频质量下,WMV格式的文件可以边下载边播放,因此很适合在网上播放和传输。
6.Divx、Xvid编码技术
我们还可以经常看的到Divx、Xvid,这两个也很容易弄混。
其实两者确实有很大渊源。DivX是一种将影片的音频由MP3来压缩、视频由MPEG-4技术来压缩的数字多媒体压缩格式。DivX就是从微软公司MPEG-4 v3编码技术中派生出的最为知名以及被广大DVDRipper广泛采用的视频编码技术。用它编码的视频文件不仅最大程度上还原了DVD原本的画面质量,而且可以允许你选择几乎所有格式的音频。它的视频部分采用的是微软的MPEG-4技术进行压缩,而音频部分则是采用MP3或WMA进行压缩,然后把视频和音频部分进行完美组合成让我们耳目一新的AVI文件,就是DivX影片了。DivX最早是由国外的一名电脑游戏玩家和一名黑客制作,他们破解了微软的MPEG-4视频压缩算法而后重新改写并重新命名为DivX。
XviD是目前世界上最常用的视频编码解码器(codec),而且是第一个真正开放源代码的,通过GPL协议发布。在很多次的codec比较中,XviD的表现令人惊奇的好,总体来说是目前最优秀、最全能的codec。可以说XviD是与Divx一脉相承而又有所加强的。
评论
查看更多