我有一個IP攝像機,其能夠進行流式傳輸的數據通過RTP在H.264編碼格式。這個原始流是從以太網記錄的。有了這些數據,我必須工作。
目標:
在我想有一個* .MP4文件,我可以用常用的媒體播放(如VLC或Windows MP)比賽結束。
我有什麼迄今所做的:
我採取原始流數據我並解析它。由於數據已經通過RTP傳輸,我需要照顧NAL字節,SPS和PPS。
1.寫一個原始文件
首先我確定以太網接收到的每個幀的類型。爲此,我分析了每個RTP有效負載的前兩個字節,這樣我就可以得到8個NAL單元位,片段類型位以及開始,保留和結束位。在有效載荷,他們正在安排是這樣的:
Byte 1: [ 3 NAL Unit Bits | 5 Fragment Type Bits]
Byte 2: [Start Bit | Reserved Bit | End Bit | 5 NAL Unit Bits]
從這個我可以判斷:
- 開始和 視頻幀結束 - >起始位和結束位
- 類型有效載荷 - > 5片段類型位
- NAL單元字節
片段類型所必需在我的情況是:
Fragment Type 7 = SPS
Fragment Type 8 = PPS
Fragment Type 28 = Video Fragment
NAL字節是通過將NAL單元位從字節1和2放在一起創建的。
現在取決於碎片I型執行以下操作:
SPS/PPS:
- 寫NAL前綴(
0x00 0x00 0x01
),然後將SPS或PPS數據
帶起始位的碎片
- 寫NAL前綴
- 寫NAL單元字節
- 寫剩餘的原始數據
碎片無起始符
- 寫原始數據
這意味着我的原始文件看起來像li柯本:
[NAL Prefix][SPS][NAL Prefix][PPS][NAL Prefix][NAL Unit Byte][Raw Video Data][Raw Video Data]....[NAL Prefix][NAL Unit Byte][Raw Video Data]...
每PPS和SPS我在流數據發現,我只寫一個NAL前綴(0×00 0×00 0×01),然後將SPS/PPS本身。
現在我不能玩這個數據與一些媒體播放器,這使我:因爲我想避免的工作多與編解碼器
2.轉換文件
我只是去使用現有的應用程序 - > FFmpeg。這個我用這些參數調用:
ffmpeg.exe -f h264 -i <RawInputFile> -vcodec copy -r 25 <OutPutFilename>.mp4
-f h264
:這應該說的ffmpeg我有一個H264編碼流
-vcodec copy
:引用的手冊頁:
Force video codec to codec. Use the "copy" special value to tell that the raw codec data must be copied as is.
-r 25
:將幀速率設置爲25 FPS。
當我用這些參數調用ffmpeg時,我得到了一個.mp4文件,我可以使用VLC和Windows MP進行播放,所以它實際上可以工作。但是這個文件現在看起來與我的原始文件有點不同。
這使我對我的問題:
什麼我實際上做?
我的問題不是它不工作。我只想/需要知道我實際上用ffmpeg調用了什麼。我有一個原始的H264文件,我不能發揮。使用FFmpeg我可以發揮它。
有最初的原始文件之間以及在一個由FFmpeg的寫入的以下差異(我已經寫):
- 部首:FFmpeg的文件具有類似於大約的0x30部首 的字節
- 頁腳: ffmpeg的文件也有一個頁腳
- 更改前綴和2個新的字節:
雖然從原始文件新的視頻幀開始像 [NAL Prefix][NAL Unit Byte][Raw Video Data]
在新文件中,它看起來是這樣的:
[0x00 0x00][2 "Random" Bytes][NAL Unit Byte][Raw Video Data].....[0x00 0x00[2 other "Random" Bytes][NAL Unit Byte][Raw Video Data]...
據我所知,視頻流需要一個容器格式(糾正我,如果我錯了,但我相信,新的頁眉和頁腳是負責這一點)。但爲什麼它實際上會改變原始數據中的一些字節?它不能被解碼,因爲流本身應該被播放器解碼,而不是ffmpeg。
正如你所看到的,我並不需要一個新的解決方案來解決我的問題,所以我可以自己解釋一下。 ffmpeg實際上做了什麼?爲什麼它會改變視頻數據中的一些字節?
你能達到這個目標嗎?如果是的話,你願意分享解決方案嗎?謝謝! – 2017-03-06 22:45:00