我有一个来自IP摄像机的原始H.264流,打包在RTP帧中。我想将原始H.264数据转换为文件,以便我可以将它转换为ffmpeg
。H.264 over RTP - 识别SPS和PPS帧
所以,当我想将数据写入到我生的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]
....
所以我得到的SPS
和PPS
从Session Description Protocol
出来的我前面的RTSP
通信。此外,在开始使用视频流本身之前,相机会在两条单独消息中发送SPS
和PPS
。
所以我捕捉到的消息顺序:
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
再就是出现一些框架的有效载荷,并在某些时候RTP框架与Marker Bit = 1
。这意味着(如果我说得对)我有一个完整的视频框架。因此,我再次从有效载荷中写入前缀序列(00 00 01
)和NAL
,并继续执行相同的过程。
现在我的相机每隔8个完整的视频帧发送给我SPS
和PPS
。 (同样在两个RTP帧中,如上例所示)。我知道特别是PPS
可以在流媒体之间改变,但这不是问题。
我的问题,现在:
1.我是否需要写的SPS/PPS每8个视频帧?
如果我的SPS
和我的PPS
不改变它应该足以让他们写在我的文件的开头,没有更多?
2.如何区分SPS/PPS和普通RTP帧?
在我解析传输数据的C++代码中,我需要区分具有正常有效负载的RTP帧和携带SPS/PPS
的RTP帧。我怎样才能区分它们?好的SPS/PPS
帧通常是小的,但这不是一个救人的呼吁依靠。因为如果我忽略它们,我需要知道可以扔掉哪些数据,或者如果我需要写出它们,我需要将00 00 01
前缀放在它们前面。 ?或者它是一个固定的规则,他们每8个视频帧发生?
感谢您的这个问题。我和你有同样的问题。我通过live555源代码阅读,不知道为什么他们保存每个数据包/框架。阅读完这篇文章后,事情就变得很清楚了。作为基于live555实现的建议,标记位仅用于其他编解码器,H264具有自己的start_bit和end_bit来表示帧的开始/结束,标记位不用于H264。 – user534498 2015-03-31 01:50:24