音视频入门基础:H.264专题(9)——SPS简介
一、SPS简介
nal_unit_type为7的NALU是SPS(Sequence parameter set,序列参数集):
H.264官方文档《T-REC-H.264-202108-I!!PDF-E.pdf》第44页到45页对SPS的数据语法进行了说明:
SPS和PPS中存放了解码过程中所需要的各种参数。一般情况下SPS和PPS位于整个码流的起始位置,解码器在解码一路码流的时候,首先要读入SPS和PPS,没有它们,视频将会无法解码。通过解析SPS中的特定参数,可以获取到视频的帧率、分辨率、这路码流的编码档次、像素格式(是YUV 4:2:0、YUV 4:2:2还是YUV 4:4:4)等关键信息。播放器(比如vlc)播放媒体文件,就是从SPS拿到大部分的媒体信息的:
用H.264编码的实时流,比如传输流,通常用Annex B包装。由于实时流中解码器需要在码流中间开始解码,并且编码器在编码的过程中可能会改变码流的参数(如图像分辨率等),所以这些格式中通常会周期性的重复SPS和PPS包(在IDR SLICE之前)。从而让解码器可以加入一个正在进行的流,及播放一个已经在传输的流。
关于SPS中的属性可以参考:《如何在H264码流的SPS中获取宽和高信息?》、《解析H.264码流中的SPS帧和PPS帧》、《编解码技术:H264 - SPS》
二、删除SPS测试
由《音视频入门基础:H.264专题(2)——使用FFmpeg命令生成H.264裸流文件》中得到的H.264裸流文件output.h264用码流分析工具Elecard StreamAnalyzer打开如下:
可以看到0x271 到 0x28B的地址存放的是SPS。我们尝试把该SPS删掉,用notepad++打开output.h264,删掉SPS:
重新用Elecard StreamAnalyzer打开output.h264,发现SPS确实被删掉了:
用vlc播放该output.h264,发现播放器黑屏,无法播放,证明“没有SPS,视频将会无法解码”: