1. 程式人生 > >opencv打開視頻文件出錯

opencv打開視頻文件出錯

沒有 for form orm 文件 指令 open 過程 之前

使用C#調用mingw的so文件,在C++端使用opencv打開視頻。這樣的項目完成過了一個,第二次做的時候,發現opencv打開視頻文件出錯。

首先懷疑是opencv的opencv_ffmpeg2410.dll文件找不到,確認了文件位置仍然不行。

然後懷疑是新換的mingw32編譯器問題,換回了老版本仍然不行。

最後確認了視頻文件的存在性,傳遞文件名的正確性,一切正常,視頻無法打開。

在試驗過程中,出現了很多次segmentation fault的情況,發現是因為兩個mingw32編譯器和他們的運行時庫沖突問題。當我切換了環境變量更換編譯器時,由於VS2010不重啟,環境變量就不更新,所以使用VS2010啟動的程序還使用原來的運行時dll;在vim中編譯時,不退出環境變量不更新,有時根本沒有換編譯器編譯。而測試編譯器時一般都是在新建的命令窗口中輸入g++ --version,這樣看到的結果都是對的。

為了確認程序引用的dll正確性,關閉了所有程序,刪除了散亂的運行時dll,將PATH環境變量整理後,打開了之前項目裏做的工程,結果之前的工程能夠在兩個版本編譯器下正確運行,而且與so文件位置無關。此時問題定位在了新寫的so庫上。

將新的工程中so庫的代碼一點一點的註釋,最後只剩下視頻部分,仍然不能打開。再將老工程直接復制過來,接口與新的工程做成一樣的,就是讓新的C#程序調用老的so文件,結果能夠成功打開,然後在老so基礎上逐步修改,發現修改指令部分時就出錯了,最後懷疑是視頻文件名正確性,之前確認正確性的時候只是從日誌文件中看到了文件名,在資源管理器中證明了正確性,但文件名中可能存在無法顯示的字符,導致無法訪問。所以在程序中加入了 slog.log(sFormat("%s,%d",url.c_str(),url.size()).c_str()); 輸出文件名的長度為26個字符,而使用無法打開視頻的代碼,文件名長度為27字符,說明不對,多出來的是文件名前端的空格,修改命令解析部分,刪除空格後,正確執行。

opencv打開視頻文件出錯