完美cvCreateVideoWriter寫出AVI文件爲空的問題

首先看看網上的其他各種解決方案:
1,
http://blog.sina.com.cn/s/blog_676f9c520100ubol.html

運行第二章的第十個例子“寫入AVI視頻文件”時,寫到磁盤的avi文件總是爲空:
CvVideoWriter *writer = cvCreateVideoWriter(output,CV_FOURCC(‘M’,’J’,’P’,’G’),fps,size);

調試時發現得到的writer爲空,看到介紹這方法時有提及具備相應的 codec才能成功,但因本人音/視頻方面知識比較淺薄,自以爲再爛,MJPG這麼常見的應該具備吧,查列表換了幾種都不成功。後來看到cvCreateVideoWriter的使用說明中有一句話:Under Win32 it is possible to pass -1 in order to choose compression method and additional compression parameters from dialog。使用-1替換CV_FOURCC,運行時會有提示讓你自己選擇 codec:
CvVideoWriter *writer = cvCreateVideoWriter(output,-1,fps,size);
出現如下提示:
這裏寫圖片描述
選擇其中一個,繼續運行,就可以成功寫出文件了。至於MJPG到底有沒有的問題,還需繼續學習!

2,
http://blog.csdn.net/wqvbjhc/article/details/5617759
cvCreateVideoWriter函數的說明
創建視頻文件寫入器
typedef struct CvVideoWriter CvVideoWriter;
CvVideoWriter* cvCreateVideoWriter( const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1 );
filename
輸出視頻文件名。
fourcc
四個字符用來表示壓縮幀的codec 例如,
CV_FOURCC(‘P’,’I’,’M’,’1’) = MPEG-1 codec
CV_FOURCC(‘M’,’J’,’P’,’G’) = motion-jpeg codec
CV_FOURCC(‘M’, ‘P’, ‘4’, ‘2’) = MPEG-4.2 codec
CV_FOURCC(‘D’, ‘I’, ‘V’, ‘3’) = MPEG-4.3 codec
CV_FOURCC(‘D’, ‘I’, ‘V’, ‘X’) = MPEG-4 codec
CV_FOURCC(‘U’, ‘2’, ‘6’, ‘3’) = H263 codec
CV_FOURCC(‘I’, ‘2’, ‘6’, ‘3’) = H263I codec
CV_FOURCC(‘F’, ‘L’, ‘V’, ‘1’) = FLV1 codec
若編碼器代號爲 -1,則運行時會彈出一個編碼器選擇框.
fps
被創建視頻流的幀率。
frame_size
視頻流的大小。
is_color
如果非零,編碼器將希望得到彩色幀並進行編碼;否則,是灰度幀(只有在Windows下支持這個標誌)。
函數cvCreateVideoWriter創建視頻寫入器結構。

遇到的問題
第二個參數除了選擇-1(基於Windows平臺)讓其彈出一個窗口選擇壓縮幀格式或先獲取視頻編碼屬性,然後設置寫入器編碼屬性,就能創建成功了
outCompressCodec = (int)cvGetCaptureProperty(pCapture, CV_CAP_PROP_FOURCC);
pVideo = cvCreateVideoWriter(“c://out.avi”, outCompressCodec, m_framerate, cvGetSize(frame), 1);
選擇其他參數都會出錯,在網上找了發現有不少人遇到類似的情況,但解決辦法卻沒有.
解決方法
後來偶然在網上看到一篇介紹使用opencv保存mp4格式的文章,裏面說到要安裝ffdshow軟件才能保存mp4格式的文件.我安裝完好測試確實如此.接着發現cvCreateVideoWriter函數第二個參數正常了,可以使用函數說明中的任何參數.萬事大吉.

補充:cvWriteFrame不支持ROI

版本:2.4.3
問題:VideoWriter保存的視頻不支持中文路徑
解決辦法:原來VideoWriter是調用ffmpeg編碼,它只支持utf8格式的路徑,所以在中文系統中不支持中文路徑,把中文路徑轉換爲utf8格式的路徑就行。
有一點奇怪就是,不知爲什麼VideoCapture卻支持中文路徑?

我的實際解決方案:
cvCreateVideoWriter(output,CV_FOURCC(‘M’,’J’,’P’,’G’),fps,size);
其中CV_FOURCC(‘M’,’J’,’P’,’G’)必須更換爲數字,如果是-1, 則會彈出對話框,讓你選擇編碼方式。但是這樣就沒法自動生成視頻文件。
而且即使安裝了ffdshow,問題仍然無法解決,CV_FOURCC()函數作爲參數仍然無法生成非空AVI文件。

於是就有了如下的最佳解決方案:
cvCreateVideoWriter(output,1,fps,size);
至於這個數字1 對應的是那種編碼方式,可以自己查看了。

發佈了102 篇原創文章 · 獲贊 82 · 訪問量 124萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章