• 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()。示例代码如下


    上述代码中,把av_bitstream_filter_filter()的输入数据和输出数据(分别对应第4,5,6,7个参数)都设置成AVPacket的data字段就可以了。

    需要注意的是bitstream filter需要初始化和销毁,分别通过函数av_bitstream_filter_init()和av_bitstream_filter_close()。

    经过上述代码处理之后,AVPacket中的数据有如下变化:

    *每个AVPacket的data添加了H.264的NALU的起始码{0,0,0,1}

    *每个IDR帧数据前面添加了SPS和PPS

    (2)手工添加SPS,PPS(稍微复杂)

    将AVCodecContext的extradata数据经过bitstream filter处理之后得到SPS、PPS,拷贝至每个IDR帧之前。下面代码示例了写入SPS、PPS的过程。通过查看FFMPEG源代码我们发现,AVPacket中的数据起始处没有分隔符(0x00000001), 也不是0x65、0x67、0x68、0x41等字节,所以可以AVPacket肯定这不是标准的nalu。其实,AVPacket前4个字表示的是nalu的长度,从第5个字节开始才是nalu的数据。所以直接将AVPacket前4个字节替换为0x00000001即可得到标准的nalu数据。

    具体代码如下:



    拷贝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:设置为非零,如果缓冲区对应于一个关键帧数据包



  • 相关阅读:
    jsp页面input输入框限制输入内容
    sql计算两个日期之间的相差天数
    sql根据一个字段日期加减7天存入另一字段中
    ajax请求捕获异常
    跨网段和局域网的SQL SERVER发布订阅配置图解和常见问题
    一次得到多个数据集
    SQL Server 2008语句大全完整版
    关于已开票已收款未发货的账务处理
    高格-一些特点话题【7】
    高格-塑料管业中厂内工单,满足随时换料的处理【6】
  • 原文地址:https://www.cnblogs.com/lidabo/p/15754020.html
Copyright © 2020-2023  润新知