我正在使用RTMP。我需要编写一个程序来捕获RTMP数据包,解析它并在flv容器中保存RTMP视频。为此,我需要在流中开始发送的SPS和PPS。但是这些数据可能会在不同的流中发送。例如:
如果我有3个视频流且只有1个流包含SPS和PPS,我如何知道哪个流属于SPS和PPS?
答案 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