2010-10-21 64 views
0

我正在用相機在Windows下編寫一些視頻文件。
我需要的數據保持不變 - 而不是MP4的「未壓縮」,即。沒有YUV,沒有顏色插值 - 只是原始相機傳感器字節流。自定義avi/MP4文件編寫器

目前我正在將此文件直接寫入磁盤並稍後重新讀取以重新編碼爲可用視頻。但沒有標題,我必須分別跟蹤圖像大小,幀率,色彩平衡等。

我可以添加一個自定義標題,但即使實際的視頻數據不能被任何非我的應用程序讀取,使用AVI文件至少會給我一個相對標準的標題來存儲所有的相機參數,也意味着解析度,長度等將顯示在資源管理器中。

有沒有一種簡單的方法來生成一個AVI頭/頁腳,而無需通過directshow或vfw發送所有數據?數據以> 250MB/s的速度進入,我不能丟失任何幀,因此我沒有時間做比將每個幀轉儲到磁盤更多的功能。

編輯:MP4也許會更好,我有一個攝像頭的配置,是不是在AVI標準大量元數據的

+0

爲什麼你要寫AVI頭到相機字節流?字節流可能不是任何可解碼的視頻格式。我會建議臨時編寫自定義標題並稍後重新處理該流以使其成爲AVI。 – arbithero 2010-10-21 20:50:31

+1

我自己的頭文件需要存儲寬度/高度/ fps /顏色 - 與avi完全一樣。如果我使用AVI,那麼Windows資源管理器至少可以顯示這些東西 - 爲什麼要創建另一種文件格式? – 2010-10-21 21:03:54

回答

1

那麼,在弄清楚什麼是'合理的'AVI頭文件是你的流(例如,如果你使用自定義編解碼器fourcc,沒有應用程序可能會做到有用的事情 - 所以爲什麼要打擾AVI? ) 你可以在你的文件開頭寫一個預構建的RIFF-AVI頭文件。找出價值並不難。然後每個幀必須包含在它自己的RIFF塊中(4字節類型:「00db」+ 4字節長+你的數據)。 事實上,您必須修復頭中的num_frames和一些長度字段。對於大於2GB的文件,不要忘記標題的OpenDML擴展名。

+0

不知道2Gb AVI限制,我在<9秒內擊中了!看起來我需要爲所有額外的標題信息使用MP4。但現在我只會爲標題信息編寫一個單獨的文本文件。 – 2010-10-21 23:29:46

+0

您還可以使用自己的類型編寫自定義即興塊,以獲取額外的標題。對於MP4/QT,您必須爲每個幀的文件位置添加一個表格,以將數據流添加到頁眉(可以是頁腳)中。哦,我忘記了RIFF塊必須填充2字節對齊。 – smilingthax 2010-10-22 00:01:51

1

馬丁,因爲你是在OpenCV的精通,不能你只需要使用cvCreateVideoWriter()用於創建未壓縮的.avi

CvVideoWriter* cvCreateVideoWriter(const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1) 

關於foucc PARAM,文檔指出:

在Win32下,同時使用一個AVI文件名,將創建一個用於創建一個壓縮的AVI文件的視頻作家如果傳遞0。

+0

opencv2.2視頻編寫器僅適用於24位彩色圖像。我剛剛提交了一堆補丁,允許讀/寫8/16位灰度級fourcc =「Y800」,「Y160」,但即使使用ffmpeg也是如此。但它現在支持openDML格式,所以> 2Gb。我現在正在考慮如何調用ffmpeg來處理標題部分,並自己進行流處理。 – 2011-04-01 21:32:15

+0

好消息,感謝@Martin。 – karlphillip 2011-04-01 21:33:34

+0

@karlphilip - 剛剛從opencv收到一封電子郵件,他們已經包含了這些補丁,以便現在可以讀取/寫入未壓縮的8位數據。 – 2011-06-24 16:39:24