2012-01-25 69 views
2

我只是想讀取IP攝像機(Basler BIP-1280c)的視頻流。 我想要的流保存在攝像機的緩衝區中,長度爲40秒,並在MJPEG中解碼。MJPEG來自IP攝像機的視頻太快

現在,如果我通過我的瀏覽器訪問流,它顯示了40秒沒有任何問題。 但實際上我需要一個能夠自行下載和保存流的應用程序。

相機通過http訪問,所以我使用libcurl來訪問它。這工作正常,我也可以下載流沒有任何麻煩。我選擇將流數據保存到* .avi文件中(希望這是正確的?)。

但現在的問題是:我可以打開視頻(嘗試使用圖騰視頻播放器和VLC),並查看所有已錄製的內容 - 但速度太快。整個視頻持續5秒(而不是40秒)。是否有MJPEG中的任何內容放置信息,如總視頻長度或fps?我的意思是視頻播放器必須缺少一些信息,以便他們能夠快速播放?

更新:

正如答案的建議,我打開該文件用16進制軟件,什麼我發現是這樣的:

--myboundary..Content-Type: image/jpeg..Content-Length: 39050.........*Exif..II*...............V...........................2...................0210................FrameNr=000398732 6.AOI=(0800x0720)@(0240,0060)/(1280x0720).Motion=00000 (no) [00000 | 00000 | 00000 | 00000 | 00000].Alarm=0000 (no) .IO =000.RtTrigger=0...Basler..BIP2-1280c..1970:01:05 23:08:10.8 98286......JFIF................................. ....&"((

該頭文件全部重新出現在文件中(後面跟着大量的二進制數據字節)。這實際上是可以的,因爲我在相機手冊中看過所有MJPEG圖片都能得到這個標題。

更有趣的是在最後一行JFIF。正如在建議的答案這可能是文件格式的指標。但afaik JFIF是一種像JPG格式的單一圖片格式。那麼這也許意味着整個視頻文件只是一些「無腦的」鏈接圖片?我的播放器只是假設他應該一個接一個地顯示這些圖片,而沒有關於幀率的任何知識?

+0

檢查您爲avi文件指定的幀速率值。計算您寫入avi的幀數,然後計算應該在40秒內全部播放它們的幀速率。 –

+0

'AVI'容器壞了(圖像可能不錯,但時間戳不是),如果你有其他的文件格式選項,也許你會想嘗試一個替代方案。具有固定的每文件幀速率的AVI不適合IP攝像機流。 –

+0

但我其實不能選擇文件格式。我只能訪問流數據,然後我需要將其轉儲到文件中。所以我對數據存儲方式沒有影響,我只能選擇文件擴展名。 – Toby

回答

6

沒有一種格式可用於MJPEG。維基百科:

[...]沒有文檔定義了 舉世公認的「Motion JPEG」 對所有上下文中使用一個完整的規範一個正確的格式。

格式因供應商而異。我的建議是仔細檢查你下載的文件。檢查是否是真的是的一個AVI容器。 (有些相機可以發送包裝在MIME容器中的幀)。

容器格式是明確的,你可以檢查出該容器的文件和尋找具有這種格式和所需FPS的文件。然後,您可以開始調整您下載的文件以獲得所需的效果。

您可能還會發現這個項目非常有用:http://mjpeg.sourceforge.net/

編輯:

根據您的樣本數據的攝像機傳送打包成一個MIME容器框架。 (第一行是邊界,然後是標題,直到遇到空行,然後是文件數據itseld,跟隨邊界等等)。

這些是JPEG文件,如標題所示:image/jpeg。 JFIF是the standard file format來存儲JPEG數據。

我建議你:

  1. 提取文件的內容分成多個JPEG文件(與munpack例如),然後
  2. use ffmpeg or mplayer創建一個電影文件出了一系列JPEG文件的。

這樣你也可以指定想要的幀速率。

如果相機動態AOI(感興趣的區域),它可以使事情變得更加複雜,這意味着它可以只發送發生變化的圖像的一小部分。但是,如果簡單的方法有效,你應該首先檢查。

+0

你有什麼建議可以嘗試確定哪種容器格式?而不是MIME格式的郵件?還是它也用於視頻傳輸?還是我得到了完全錯誤的東西? //編輯:我實際上嘗試用「Avidemux」(http://avidemux.sourceforge.net/)打開它,但它不會打開...所以我猜攝像機不會將它保存爲正確的avi格式。 。? – Toby

+1

@Toby在十六進制編輯器中打開文件。前四個字節可能會告訴你格式。 MIME也是一種容器格式(但不是特別針對多媒體)。它能夠將許多文件封裝到一個文件中。 – vbence

+0

對不起,我花了這麼長時間纔回答,但我病了......好吧,我現在用一個hexeditor打開文件,而且我看到的首先是來自我的IP攝像機的一些頭文件。然後是「JFIF」。所以我想這就是格式的描述......但JFIF只是一種普通的圖片格式......所以在我的文件中沒有保存視頻信息? – Toby

1

對於un * x系統(linux,osx,...),您可以使用cmdline工具file對文件格式進行(通常是很好的)猜測。

1

--myboundary表示該流是通過HTTP以常規M-JPEG流式傳輸的多部分內容。沒有一種衆所周知的文件格式可以保持這個流「按原樣」並且可以播放(也就是說,如果您將其重命名爲AVI則不應該播放)。

格式本身是(boundary, subheader, JPEG image)(boundary, subheader, JPEG image)...等流的序列不具有時間戳,所以播放速度完全取決於玩家。

相關問題