gpt4 book ai didi

c++ - H.264 over RTP - 识别 SPS 和 PPS 帧

转载 作者:可可西里 更新时间:2023-11-01 14:57:09 33 4
gpt4 key购买 nike

我有一个来自 IP 摄像机的原始 H.264 流,它被打包在 RTP 帧中。我想将原始 H.264 数据放入一个文件中,以便我可以使用 ffmpeg 对其进行转换。

因此,当我想将数据写入原始 H.264 文件时,我发现它必须如下所示:

00 00 01 [SPS] 
00 00 01 [PPS]
00 00 01 [NALByte]
[PAYLOAD RTP Frame 1] // Payload always without the first 2 Bytes -> NAL
[PAYLOAD RTP Frame 2]
[... until PAYLOAD Frame with Mark Bit received] // From here its a new Video Frame
00 00 01 [NAL BYTE]
[PAYLOAD RTP Frame 1]
....

因此,我从前面的 RTSP 通信中获取了来自 Session Description ProtocolSPSPPS .此外,在开始视频流本身之前,相机会在两条单独的消息中发送 SPSPPS

因此我按以下顺序捕获消息:

1. Preceding RTSP Communication here ( including SDP with SPS and PPS )
2. RTP Frame with Payload: 67 42 80 28 DA 01 40 16 C4 // This is the SPS
3. RTP Frame with Payload: 68 CE 3C 80 // This is the PPS
4. RTP Frame with Payload: ... // Video Data

然后出现了一些带有有效负载的帧,在某个时候出现了一个带有 Marker Bit = 1 的 RTP 帧。这意味着(如果我做对了)我有一个完整的视频帧。在此之后,我再次从有效负载中写入前缀序列 (00 00 01) 和 NAL,然后继续执行相同的过程。

现在我的相机在每 8 个完整的视频帧后再次向我发送 SPSPPS。 (同样在两个 RTP 帧中,如上例所示)。我知道尤其是 PPS 可以在流媒体之间改变,但这不是问题。

我现在的问题是:

<强>1。我是否需要每 8 个视频帧编写一次 SPS/PPS?

如果我的 SPS 和我的 PPS 没有改变,那么将它们写在我的文件的开头就足够了,仅此而已?

<强>2。如何区分SPS/PPS和普通RTP帧?

在我解析传输数据的 C++ 代码中,我需要区分具有正常有效载荷的 RTP 帧和携带 SPS/PPS 的 RTP 帧。我怎样才能区分它们?好吧,SPS/PPS 帧通常要小得多,但这不是可以依赖的保存调用。因为如果我忽略它们,我需要知道我可以丢弃哪些数据,或者如果我需要编写它们,我需要将 00 00 01 前缀放在它们前面。 ?还是每 8 个视频帧出现一次的固定规则?

最佳答案

  1. 如果 SPS 和 PPS 没有变化,除了第一个之外,你可以省略它们。
  2. 需要解析每个NAL的nal_unit_type字段,对于SPS,nal_unit_type==7;对于 PPS,nal_unit_type==8。

我记得,nal_unit_type 是帧的第一个字节的低 5 位。

nal_unit_type = frame[0] & 0x1f;

关于c++ - H.264 over RTP - 识别 SPS 和 PPS 帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9618369/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com