=================================================================
音视频入门基础:H.264专题系列文章:
音视频入门基础:H.264专题(1)——H.264官方文档下载
音视频入门基础:H.264专题(2)——使用FFmpeg命令生成H.264裸流文件
音视频入门基础:H.264专题(3)——EBSP, RBSP和SODB
音视频入门基础:H.264专题(4)——NALU Header:forbidden_zero_bit、nal_ref_idc、nal_unit_type简介
音视频入门基础:H.264专题(5)——FFmpeg源码中 解析NALU Header的函数分析
音视频入门基础:H.264专题(6)——FFmpeg源码:从H.264码流中提取NALU Header、EBSP、RBSP和SODB
音视频入门基础:H.264专题(7)——FFmpeg源码中 指数哥伦布编码的解码实现
音视频入门基础:H.264专题(8)——H.264官方文档的描述符
音视频入门基础:H.264专题(10)——FFmpeg源码中,存放SPS属性的结构体和解码SPS的函数分析
音视频入门基础:H.264专题(11)——计算视频分辨率的公式
音视频入门基础:H.264专题(12)——FFmpeg源码中通过SPS属性计算视频分辨率的实现
音视频入门基础:H.264专题(13)——FFmpeg源码中通过SPS属性获取视频色彩格式的实现
音视频入门基础:H.264专题(14)——计算视频帧率的公式
音视频入门基础:H.264专题(15)——FFmpeg源码中通过SPS属性获取视频帧率的实现
音视频入门基础:H.264专题(16)——FFmpeg源码中,判断某文件是否为H.264裸流文件的实现
音视频入门基础:H.264专题(17)——FFmpeg源码中,获取H.264视频的profile的实现
音视频入门基础:H.264专题(18)——FFmpeg源码获取H.264裸流文件信息(视频压缩编码格式、色彩格式、视频分辨率、帧率)的总流程
音视频入门基础:H.264专题(19)——AVCDecoderConfigurationRecord简介
音视频入门基础:H.264专题(20)——FFmpeg源码中,获取avcC封装的H.264码流中每个NALU的长度的实现
音视频入门基础:H.264专题(21)——FFmpeg源码中,解码AVCDecoderConfigurationRecord的实现
音视频入门基础:H.264专题(22)——通过FFprobe显示H.264裸流每个packet的信息
=================================================================
一、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,视频将会无法解码”: