OpenCV2.1 產生視頻選擇編碼的 bug
最近使用 OpenCV2.1 來產生視頻,在 Windows 下碰到這樣的問題:不管我用什麼樣的編碼,都沒有辦法直接產生視頻,並且會導致程式崩潰。代碼如下:
_writer = cvCreateVideoWriter( video.c_str(), CV_FOURCC('X','V','I','D'), _fps, cvSize(frameW,frameH), isColor );
但是,如果我把編碼換上 -1 選項來手工選取視頻格式,則能順利產生視頻。代碼如下:
_writer = cvCreateVideoWriter( video.c_str(), -1, _fps, cvSize(frameW,frameH), isColor );
這個應該是 OpenCV2.1 裡的一個 Bug,換成 OpenCV2.2 就沒有這個問題了。
OpenCV2.2 的 Visual Studio 2008 問題
官方的 OpenCV2.2 是在 Visual Studio 2010 下編譯的二進位包,所以,當你把 OpenCV2.2 嵌入到 Visual Studio 2008 裡,可以正常編譯相關的代碼,但是一運行,一定會提示找不到動態連結程式庫 msvcp100d.dll 或是 msvcr100d.dll 。
這個時候,你可以把這兩個 Visual Studio 2010 的動態連結程式庫拷貝到編譯好的可執行檔目錄裡。但是,最好的方式,是你在 Visual Studio 2008 裡重新編譯一下 OpenCV2.2。
OpenCV 讀取視訊框架與 DirectShow 讀取視頻的步調不一致
有一些視頻,我用 OpenCV 跳轉到指定的時間,和用 DirectShow 跳轉到視頻指定的時間,理論上來說,應該是一樣的。可是,在我這裡,偏偏就出現了跳轉視頻位置不同的情況。而且,原始視頻越長,這種誤差越大。
是什麼原因呢?
仔細研究了一下,我用 OpenCV 讀取參數,會顯示是 29 幀/秒,大約有 276168 幀;但是用 DirectShow 解碼後顯示為 30 幀/秒,計算後約為 268946 幀。
解碼後的度量時間標準不同,也就導致了上述誤差。但是,真實的原因是什麼呢?