转载请注明出处:https://blog.csdn.net/impingo
网站:http://pingos.me
H264介绍
H.264: H.264/AVC项目的目的是为了创建一个比以前的视频压缩标准,在更低的比特率的情况下依然能够提供良好视频质量的标准(如,一半或者更少于MPEG-2,H.263,或者MPEG-4 Part2 )。同时,还要不会太大的增加设计的复杂性。
优势:
1)网络亲和性,即可适用于各种传输网络。
2)高的视频压缩比,当初提出的指标是比 H.263,MPEG-4,约为它们的 2 倍,现在都已基 实现。
H264的打包方式
H264的码流的打包方式有两种:
- 一种为annex-b byte stream format的格式,这个是绝大部分编码器的默认输出格式,就是每个帧的开头的3~4个字节是H264的start_code,0x00000001或者0x000001。
- 另一种是原始的NAL打包格式,就是开始的若干字节(1,2,4字节)是NAL的长度,而不是start_code,此时必须借助某个全局的数据来获得编码器的profile,level,PPS,SPS等信息才可以解码。
annex-b 3字节起始码和4字节起始码
一共有两种起始码:3字节的0x000001和4字节的0x00000001。
- SPS、PPS nalu 和Access Unit的首个nalu是4字节起始码(参见7.4.1.2.3)。
- 其余情况都是3字节头。
这里举个例子说明:
slice | 起始码 |
---|---|
SPS | (4字节头) |
PPS | (4字节头) |
SEI | (4字节头) |
I0(slice0) | (4字节头) |
I0(slice1) | (3字节头) |
P1(slice0) | (4字节头) |
P1(slice1) | (3字节头) |
P2(slice0) | (4字节头) |
P2(slice1) | (3字节头) |
I0(slice0)是序列第一帧(I帧)的第一个slice,是当前Access Unit的首个nalu,所以是4字节头。
而I0(slice1)表示第一帧的第二个slice,所以是3字节头。
P1(slice0) 、P1(slice1)同理。
起始码处理规则
在网络传输h264数据时,一个UDP包就是一个NALU,解码器可以很方便的检测出NAL分界和解码。但是如果编码数据存储为一个文件,原来的解码器将无法从数据流中分别出每个NAL的起始位置和终止位置,为此h.264用起始码来解决这一问题。
H.264编码时,在每个NAL前添加起始码 0x0001001或者0x00000001,解码器在码流中检测到起始码,当前NAL结束。为了防止NAL内部出现0x0001001或者0x00000001的数据,h.264又提出’防止竞争 emulation prevention"机制,在编码完一个NAL时,如果检测出有连续两个0x00字节,就在后面插入一个0x03。当解码器在NAL内部检测到0x000003的数据,就把0x03抛弃,恢复原始数据。
0x000000 >>>>>> 0x00000300
0x000001 >>>>>> 0x00000301
0x000002 >>>>>> 0x00000302
0x000003 >>>>>> 0x00000303
h.264解码nalu中检测起始码的算法流程
for(;;)
{
if next 24 bits are 0x000001
{
startCodeFound = true
break;
}
else
{
flush 8 bits
}
}// for(;;)
if(true == startCodeFound)
{
//startcode found
// Flush the start code found
flush 24 bits
//Now navigate up to next start code and put the in between stuff
// in the nal structure.
for(;;)
{
get next 24 bits & check if it equals to 0x000001
if(false == (next 24 bits == 000001))
{
// search for pattern 0x000000
check if next 24 bits are 0x000000
if(false == result)
{
// copy the byte into the buffer
copy one byte to the Nal unit
}
else
{
break;
}
}
else
{
break;
}
}//for(;;)
}
QQ交流群:697773082
本文内容整理自网络,由于内容被多次转载已经无法追溯到源头,如有侵权请告知,本人将及时删除。