其他分享
首页 > 其他分享> > H.264中的SPS和PPS

H.264中的SPS和PPS

作者:互联网

参考http://blog.csdn.net/leixiaohua1020/article/details/11800877


H.264码流第一个 NALU是 SPS(序列参数集Sequence Parameter Set) 对应H264标准文档 7.3.2.1 序列参数集的语法进行解析
H.264码流第二个 NALU是 PPS(图像参数集Picture Parameter Set) 对应H264标准文档 7.3.2.2 序列参数集的语法进行解析
H.264码流第三个 NALU 是 IDR(即时解码器刷新) 对应H264标准文档 7.3.3 序列参数集的语法进行解析 H2.64中I帧和IDR帧的区别    I和IDR帧都是使用帧内预测的。它们都是同一个东西而已,在编码和解码中为了方便,要首个I帧和其他I帧区别开,所以才把第一个首个I帧叫IDR,这样就方便控制编码和解码流程。IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始,重新算一个新的序列开始编码。而I帧不具有随机访问的能力,这个功能是由IDR承担,IDR会导致DPB(参考帧列表——这是关键所在)清空,而I不会。IDR图像一定是I图像,但I图像不一定是IDR图像。一个序列中可以有很多的I图像,I图像之后的图像可以引用I图像之间的图像做运动参考。一个序列中可以有很多的I图像,I图像之后的图象可以引用I图像之间的图像做运动参考。   对于IDR帧来说,在IDR帧之后的所有帧都不能引用任何IDR帧之前的帧的内容,与此相反,对于普通的I-帧来说,位于其之后的B-和P-帧可以引用位于普通I-帧之前的I-帧。从随机存取的视频流中,播放器永远可以从一个IDR帧播放,因为在它之后没有任何帧引用之前的帧。但是,不能在一个没有IDR帧的视频中从任意点开始播放,因为后面的帧总是会引用前面的帧。

在分离H.264码流的时候,直接存储AVPacket后的文件可能是不能播放的。

如果视音频复用格式是TS(MPEG2 Transport Stream),直接存储后的文件是可以播放的。

复用格式是FLV,MP4则不行。

经过长时间资料搜索发现,FLV,MP4这些属于“特殊容器”,需要经过以下处理才能得到可播放的H.264码流:

1.分离某些封装格式(例如MP4/FLV/MKV等)中的H.264的时候,需要首先写入SPS和PPS,否则会导致分离出来的数据没有SPS、PPS而无法播放。H.264码流的SPS和PPS信息存储在AVCodecContext结构体的extradata中。需要使用ffmpeg中名称为“h264_mp4toannexb”的bitstream filter(比特流过滤器)处理。有两种处理方式:

(1)使用bitstream filter处理每个AVPacket(简单)

把每个AVPacket中的数据(data字段)经过bitstream filter“过滤”一遍。关键函数是av_bitstream_filter_filter()。示例代码如下


拷贝4个字节(0x00000001

当封装格式为MPEG2TS的时候,不存在上述问题。

2、SPS和PPS

SDP中的H.264的SPS和PPS串,包含了初始化H.264解码器所需要的信息参数,包括编码所用的profile,level,图像的宽和高,deblock滤波器等。
3、相关函数介绍 (1)av_bitstream_filter_init 输入参数: 比特流过滤器的名字 输出参数:根据比特流过滤器的创建并初始化一个比特流过滤器的上下文。
(2)av_bitstream_filter_filter 参数1:比特流过滤器的上下文 参数2:avcodeccontext输出流的编码器上下文.。 参数3:指定筛选器配置的参数,可能为空.  参数4:指针被更新以指向过滤缓冲区.  参数5:指针以字节形式更新到已过滤的缓冲区大小.  参数6:包含数据到过滤器的缓冲区  参数7:在字节缓冲区大小  参数8:设置为非零,如果缓冲区对应于一个关键帧数据包


标签:filter,H.264,bitstream,SPS,IDR,PPS
来源: https://www.cnblogs.com/lidabo/p/15754020.html