我有一個來自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