2012-07-18 202 views
13

環境:H.264變換用的FFmpeg(從RTP流)

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

  1. 寫NAL前綴(0x00 0x00 0x01),然後將SPS或PPS數據

帶起始位的碎片

  1. 寫NAL前綴
  2. 寫NAL單元字節
  3. 寫剩餘的原始數據

碎片無起始符

  1. 寫原始數據

這意味着我的原始文件看起來像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的寫入的以下差異(我已經寫):

  1. 部首:FFmpeg的文件具有類似於大約的0x30部首
  2. 的字節
  3. 頁腳: ffmpeg的文件也有一個頁腳
  4. 更改前綴和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實際上做了什麼?爲什麼它會改變視頻數據中的一些字節?

+1

你能達到這個目標嗎?如果是的話,你願意分享解決方案嗎?謝謝! – 2017-03-06 22:45:00

回答

0

看起來像流打包。許多容器格式將比特流分成數據包並添加一些信息,例如時間戳,數據包的長度等。這給鉤子解碼器跳過文件而不解碼所有數據,當數據包丟失時重新同步,同步音頻/視頻,組合多個流等

看更多信息,MP4文件格式信息:
http://en.wikipedia.org/wiki/MPEG-4_Part_14

2

除了增加了MP4容器,ffmpeg的轉換你的H.264附件B字節流(以NAL前綴)爲長度前綴格式。

您的[0x00 0x00] [2「Random」Bytes]是一個32位整數,以字節爲單位給出以下NAL單元的長度。

-1

您可以通過打開h264 specs瞭解有關更改的更多信息。章附錄B.