为什么SPS和PPS在不同的块流ID中出现?

时间:2017-02-17 14:11:15

标签: video stream h.264 rtmp flv

我正在使用RTMP。我需要编写一个程序来捕获RTMP数据包,解析它并在flv容器中保存RTMP视频。为此,我需要在流中开始发送的SPS和PPS。但是这些数据可能会在不同的流中发送。例如:

  1. 在流6中发送的SPS和PPS以及在流7中发送的视频数据。
  2. SPS,PPS和视频数据来自第7流。
  3. 如果我有3个视频流且只有1个流包含SPS和PPS,我如何知道哪个流属于SPS和PPS?

2 个答案:

答案 0 :(得分:1)

  

"如果我有3个视频流且只有1个流包含SPS和PPS,我如何知道哪个流属于SPS和PPS?"

SPS和PPS仅用于设置MPEG解码器。一旦它设置为处理一个流,您可以更改为解码文件中的其他流,而无需任何新的SPS& PPS。

除非3个流完全不同(即:每个流具有不同的图像大小和不同的帧速率等)。在这种情况下,您需要新的SPS& PPS。

答案 1 :(得分:1)

正如我在我的案例中注意到的那样,我们在RTMP中获得的第一个视频帧具有这两个值。将其存储为单个FLV文件时,可以将其作为第一帧。

但是,如果您想将其分割为更短间隔的较小文件(例如,使用DASH进行流式传输),则需要将第一帧粘贴到您创建的每个分割文件中。这可以在ffmpeg的帮助下自动完成。在这种情况下,如果要将代码包含在该RTMP客户端中,则可以遵循此步骤。否则,除了第一个文件外,您可能无法播放拆分文件。

如上所述,第一帧转换为十六进制字符串:

17 - It represents 1 - Keyframe
                   7 - H.264 
00 00 00 00 01 64 00 28 ff e1 00 - ?  
1a - Size of the SPS 
67 64 00 28 ac d9 40 78 02 27 e5 84 00 00 03 00 04 00 00 03 00 f2 3c 60 c6 58 - SPS
01 - According to AMF0 01 represent number
00 04 - Size of PPS
68 ef bc bc - PPS

(我不确定后跟- ?的十六进制表示什么。如果有人可以填写该部分,请随时发表评论,我将更新我的答案。)

要详细了解什么是SPS:Refer Here