H.264基本概念总结之SPS,PPS,SEI

date
Mar 16, 2022
slug
2022-03-16-h264-sps-pps-sei
status
Published
tags
H.264
音视频
summary
本文总结了H.264视频编解码技术中的SPS、PPS、SEI等概念。
type
Post

SPS

  • Sequence Parameter Set (SPS): This non-VCL NALU contains information required to configure the decoder such as profile, level, resolution, frame rate, which apply to a series of consecutive coded video pictures called a coded video sequence.
SPS是指针对整个编码图像序列的全局参数信息,例如分辨率、帧率、H.264编码时使用的Profile和Level等。
与编码后的图像帧数据数据一样,SPS信息也被封装在NALU单元中。SPS所对应的NALU Header Type一般为0x67。所以当对接收到的264数据流进行解析,发现某个NALU是以0x00 0x00 0x00 0x01 0x67开头,就表示这个NALU中封装的信息是SPS信息。

PPS

  • Picture Parameter Set (PPS): Similar to the SPS, this non-VCL NALU contains information on entropy coding mode, slice groups, motion prediction, quantization parameters (QP), and deblocking filters, which apply to the decoding of one or more individual pictures within a coded video sequence.
PPS是指针对编码图像序列中各个图像帧所依赖的参数信息,主要是对这帧图像进行H.264编码时使用的编码相关的参数,如熵编码模式、Slice分组模式、QP设置等。
与编码后的图像帧数据数据一样,PPS信息也被封装在NALU单元中。PPS所对应的NALU Header Type一般为0x68。所以当对接收到的264数据流进行解析,发现某个NALU是以0x00 0x00 0x00 0x01 0x68开头,就表示这个NALU中封装的信息是PPS信息。

SPS与PPS的位置

为了能够确保播放器对H.264编码数据进行正确的解码,在播放器的解码器正式开始工作之前,必须要对解码器使用PPS和SPS中包含的信息进行了正确的初始化。
而对于编码器而言,编码器输出的第一帧数据一般是PPS,然后是SPS,然后是I帧、P帧、B帧等。
对于这些数据作为流媒体通过网络等发送出去,或者保存在本地的H264文件中,一般则以SPS、PPS、I帧、P帧、B帧......这样的顺序进行处理。这样的话就可以确保接收端或者解码器端,能够按照正确的顺序先设置好解码器的运行参数,然后再进行图像解码的处理。
此外,SPS和PPS也可能出现在码流的中间位置,主要的原因可能是:
  • 解码器端可能是在流媒体数据传输的中间阶段才开始接收数据的,那么要能够对后续的流媒体数据进行正确解码,就需要在码流中间中间插入SPS和PPS信息,确保解码器能够得到正确的设置;
    • 对于这种情况,比较合理的做法应该是在每个I帧之前都包含有SPS和PPS信息。
  • 编码器在编码的过程中改变了码流的参数(如图像的分辨率),这样解码器在收到新的PPS和SPS信息以后,就需要使用并设置新的PPS和SPS参数到解码器中;
如果编码器产生的媒体流文件是保存在本地的多媒体容器文件中进行封装,一般会把SPS和PPS信息放在封装格式的头信息中。这样解码器在解封装的时候就可以从中读取并设置与这个媒体封装文件相匹配的SPS和PPS信息。

SEI

SEI:Supplemental Enhancement Information,补充增强信息,可以提供在多媒体流中同步传输额外的自定义信息的功能。
SEI把用户自定义的信息放入流媒体信息中一起传输,可以实现用户自定义信息与音视频流媒体播放的实时同步。
  • 一个比较典型的例子是网络直播:在主播把音视频流媒体信息传输给观看者的同时,主播还可以发送自己的文字等即时通讯信息。虽然这些信息可以通过其他通信渠道传给观看者,但是因为音视频和即时通信是分开的,两个信息的同步呈现往往就会是比较大的问题。而如果把用户的即时通信信息放入SEI信息中,与多媒体信息一起封装在NALU中传给观看者,就可以保证这两类信息呈现的实时同步。
解码器端对于SEI信息的解析和处理是可选选项,在不关注SEI信息的时候,可以直接把包含SEI新的NALU丢弃掉。
既然SEI的信息是用户自定义的,那么只要编码/发送端与接收/解码端都是由同一个用户进行控制和实现,那么他就可以在SEI中封装自己想要放入的任何类型的信息。
SEI所对应的NALU Header Type的低5bit为0x06。所以当对接收到的多媒体数据流进行解析,发现某个NALU的header byte的低5位(NAL Unit Type)为0x06,就表示这个NALU中封装的信息是SEI信息。

参考资料:

  1. H.264 video codec — Kurento 6.16.1-dev documentation (doc-kurento.readthedocs.io)
  1. Network Abstraction Layer - Wikipedia
  1. 2.h264的nalu单元解析:sps、pps、sei的概念_yanghangwww的博客-CSDN博客_h264 nalu单元
  1. FFmpeg从入门到精通——进阶篇,SEI那些事儿 - 知乎 (zhihu.com)

© Pavel Han 2020 - 2022