对H264码流数据的NAL起始字节分析(档次、NALU类型)
来源:互联网 发布:mcu选型软件 编辑:程序博客网 时间:2024/05/02 00:53
这是一段H264码流,00 00 00 01这是对应forbidden_zero_bit的f(1),接着后面的nal_ref_idc的u(2),这个怎么解呀,有点晕。刚接触不久,nal_unit_type的u(5),后面的profile_idc的u(8)指的是那几个,是多少?
00 00 00 01是Start code后面的ox67为 0110 0111
forbidden_zero_bit 是禁止位,应该是第一位即f(1)=0,1为语法有错误
nal_ref_idc是参考级别,代表被其它帧参考情况,u(2)= 11 = 3最(0为无参考,详见规范)
nal_unit_type是该帧的类型,为剩下的5位,u(5)= 0 0111 = 7
NOTE:这是NALU类型,非Slice类型,这里只能判断NALU类型,不能继续判断是普通i还是p等slice类型
NALU类型:
目前类型有:
//H264定义的类型 values for nal_unit_type
typedef enum {
#if (MVC_EXTENSION_ENABLE)
#endif
} NaluType;
可以看出是NALU_TYPE_SPS
H264档次:
profile_idc的u(8)则是后面的“64”转化为十进制则是100,
66 Baseline
77 Main
88 Extended
100 High (FRExt)
110 High 10 (FRExt)
122 High 4:2:2 (FRExt)
144 High 4:4:4 (FRExt)
100是High (FRExt)
======================================================================================
使用RTSP传输H264的时候,需要用到sdp协议描述,其中有两项:Sequence Parameter Sets (SPS) 和Picture Parameter Set (PPS)需要用到,那么这两项从哪里获取呢?答案是从H264码流中获取.在H264码流中,都是以"0x00 0x00 0x01"或者"0x00 0x00 0x00 0x01"为开始码的,找到开始码之后,使用开始码之后的第一个字节的低5位判断是否为7(sps)或者8(pps), 及data[4] & 0x1f == 7 || data[4] & 0x1f == 8.然后对获取的nal去掉开始码之后进行base64编码,得到的信息就可以用于sdp. sps和pps需要用逗号分隔开来.
if(( 0 == *(lpDataBuf+0) ) &&
( 0 == *(lpDataBuf+1) ) &&
( 0 == *(lpDataBuf+2) ) &&
( 1 == *(lpDataBuf+3) ) )
{
fNalType = (0x01f&(*(lpDataBuf+4))); //低5位判断是否为
}
if( 7 == fNalType )/*SPS*/
00 00 00 01是一个nalu的起始标志。后面的第一个字节,67,是nalu的类型,type & 0x1f == 0x7表示这个nalu是sps,== 0x8表示是pps
先理解关键知识点,不知道有没有误导,H264的帧是以 NAL单元的单位来传送的,一个NAL单元包含一帧(I帧 或 P帧 或 B帧),这三种类型的帧可以百度。所谓的NAL单元就是去掉SPS、PPS的视频帧, I帧是关键帧,所有的解析都需要靠它,两个I帧之间被称为视频序列,I帧头部需要加入SPS和PPS,这两个之间需要0x00000001来分割, 0x00 0x00 0x00 0x01 + SPS的Base64解码形式 + 0x00 0x00 0x00 0x01 + PPS的解码形式 + 0x00 0x00 0x00 0x01 视频帧(IDR帧) 这样组成的一个buffer,FFMPEG的H264解码器才能成功解码。
I帧和IDR帧的区别:
1. 在 H.264 中 I 帧并不具有随机访问的能力,这个功能由 IDR 承担。以前的标准中由 I 帧承担。
2. IDR 会导致 DPB (参考帧列表——这是关键所在)清空,而 I 不会。
3. I和IDR帧其实都是I帧,都是使用帧内预测的。但是IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始,重新算一个新的序列开始编码。
4. IDR图像一定是I图像,但I图像不一定是IDR图像。一个序列中可以有很多的I图像,I图像之后的图像可以引用I图像之间的图像做运动参考。
- 对H264码流数据的NAL起始字节分析(档次、NALU类型)
- H264码流的NAL起始字节分析
- NALU(NAL单元)的顺序要求
- NALU(NAL单元)的顺序要求
- NALU(NAL单元)的顺序要求
- NALU(NAL单元)
- H264视频码流分解为NALU数据代码
- h264 NALU的获取与分析
- 音视频数据处理(17)--- H.264的NAL层数据单元NALU
- h264 nalu分析
- H264 NAL 分析
- H264码流的I/P/B帧NALU判断
- 获取H264的NALU
- H264码流解析及NALU
- 音视频数据处理(18)--- H.264的NAL层数据单元NALU与I帧判断
- rtp对h264 nalu fu-a的处理
- H264码流分析:NAL VCL层,SPS PPS,annexb模式
- H264 的 NAL 的问题
- jmp指令的机器码编写
- Linux下I2C驱动架构全面分析
- 网站建设的基础入门
- 它会知道什么编译的
- 非递归先,中,后遍历二叉树
- 对H264码流数据的NAL起始字节分析(档次、NALU类型)
- SQL SERVER 导入 EXCEL “文本被截断,或者一个或多个字符在目标代码页中没有匹配项”
- 双目视觉与虚拟现实之间
- IOS Dev Intro - Opengl ES Series 01
- javascript实现的base64编码解码
- 透明度计算,百分比和十六进制关系
- ionic使用记录---栅格模式
- 仿微信上传图片功能
- 第十六周项目1:说出程序的功能,并上机验证(1)