我有一张卡,它在每个I帧之前直接按顺序生成带有SPS(序列参数集)和PPS(图像参数集)的H264流。我看到大多数H264流在第一个I帧上包含PPS和SPS。
这是推荐的吗?解码器/复用器通常支持多个PPS和SRS吗?
答案 0 :(得分:27)
H.264有多种流格式。一种变体称为“附件B”。
(AUD)(SPS)(PPS)(I-Slice)(PPS)(P-Slice)(PPS)(P-Slice)...(AUD)(SPS)(PPS)(I-Slice)
通常,您会在每个I帧之前看到SPS / PPS,在其他切片之前看到PPS。
大多数解码器/复用器都对“附件B”和SPS / PPS的重复感到满意。
如果您更改格式和SPS / PPS中游,大多数解码器/复用器都不会有任何意义。
大多数解码器/复用器解析第一个SPS / PPS作为设置过程的一部分,并忽略后续的SPS。
某些解码器/复用器更喜欢没有(AUD),起始码和SPS / PPS的H.264。 然后,您必须在设置解码器/复用器时将带外SPS / PPS送入。
答案 1 :(得分:21)
如果没有SPS和PPS,则无法解码IDR帧或I片。对于像mp4这样的容器,SPS和PPS远离文件头中的视频数据存储。在播放时,解析mp4,SPS / PPS用于配置AVC解码器一次,然后视频可以从任何IDR / I片开始播放。
第二种情况是直播视频。使用实时视频,没有文件头,因为没有文件。因此,当电视调入频道时,它会在哪里获得SPS / PPS?由于电视是广播的,意味着电视无法请求SPS / PPS,因此会在视频流中重复播放。
因此,当您开始编码视频时,您的编码器不知道您打算如何处理视频。现在,如果额外的SPS / PPS出现在mp4中,解码器就会忽略它们,但是如果你正在流式传输到电视,没有它们,流将永远不会播放。因此大多数默认情况下重复使用SPS / PPS。
答案 2 :(得分:1)
我知道matroska(mkv)规范,所以这里SPS和PPS只存储一次作为编解码器私有数据部分。因此,它们不会重复每个i帧或IDR帧。
如果您的h264流每个i帧/ IDR帧都有SPS / PPS,那么matroska muxer将只在编解码器私有数据中存储1个副本。
因此,虽然存储基于用例的容器格式建议仅使用SPS / PPS的一个副本,但是基于广播和流的容器格式建议在每个iFrame / IDR帧之前发送SPS / PPS,或者当时任何编解码器改变h264流中的变化