关于I帧,P帧,B帧和NAL单元的联系。还有slice片和NAL与各帧之间的关系
问题如上:
先说一下个人的理解。分析一个h264文件,以00 00 00 01开始和结尾的部分代表一个NAL单元。live555里面在给每一帧打上时间戳的时候是读取一个完整的NAL单元,之后再读取下一NAL单元。用analyze_slice_header()函数分析这两个slice_header的区别。如果标志字段frame_num,pic_parameter_set_id,field_pic_flag,bottom_field_flag等不相等,就说明当前帧已经是下一帧了,就把slice_header相同的NAL当成是一帧,打上相同的时间戳经过rtp发送出去。
那这么说。
1:一个NAL单元就是一个slice(片)了,而一帧不一定就是一个NAL单元了。一帧里面可能有多个NAL单元(也就是slice)。
2:NAL单元的头信息中的type字段我们能知道当前类型是sps,pps和IDR类型。但是不能判断当前帧是什么类型(I帧P帧等)。那如果一帧中有多个NAL那是I帧 还是P帧 我们怎么判断呢?是根据slice_head的字段判断吗?
我也是刚学 很多东西不懂希望和大家一起交流。
看有的文章 别人说一帧就是一个nal,I帧可以通过nal头获取 ,那p帧和b帧呢 ?有点困惑 请高人指点哦
[解决办法]
H264的编码方式有两种:帧编码(Frame)和场编码(Interlace)
其中,帧编码一般一个NAL单元就一个图像Slice,场编码则由顶场和底场构成,每个NAL单元可能包含多个图像SLICE片,也有可能就一个,但只有同一个Frame_Num的顶场和底场,才能构成一幅完整图像
判断IDR、I、P、B的类型,就是通过SLICE_HEADER的信息来看,看它的SLICE_TYPE是哪种。
[解决办法]
一个nal就是一个slice,是不对的,至少是不精确的。你把两个不同的概念混淆了。以这个为前提,去做工作,接下来的工作就没有意义。
[解决办法]
对于帧编码的话,如果一个帧包涵多个slice,那么有一种方法可以按照每个slice的宏块(MB)位置来区分的,一个帧的第一个slice的宏块位置应该是0
具体,可以用elecard stream工具来分析,一目了然