2011-12-07 67 views
17

我只是寫了一個簡單的視頻讀取與openCV2.3.1例子,但似乎我無法打開AVI視頻反正:(爲什麼我無法在openCV中打開avi視頻?

VideoCapture capture("guitarplaying.avi"); 
if(!capture.isOpened()){ 
    std::cout<<"cannot read video!\n"; 
    return -1; 
} 
Mat frame; 
namedWindow("frame"); 

double rate = capture.get(CV_CAP_PROP_FPS); 
int delay = 1000/rate; 

while(true) 
{ 
    if(!capture.read(frame)){ 
     break; 
    } 
    imshow("frame",frame); 

    if(waitKey(delay)>=0) 
     break; 
} 

capture.release(); 

std::cout<<"cannot read video!\n"做了一個斷點,發現它停在這裏的每一次。因此,爲什麼avi視頻無法打開?謝謝!

+1

AVI是一種文件格式,不是視頻格式。因此,您應該檢查視頻是否以支持的視頻格式編碼,因爲AVI文件可能以不同的方式進行編碼。 – Macmade

回答

4

1)
確保視頻文件實際上是在同一文件夾中的應用程序(我假設你已經嘗試過這一點),否則指定絕對路徑。

2)
如果您使用的是Windows,你可能需要一個解碼包讀取視頻文件(例如,K-Lite Codec Pack)。

正如Macmade所建議的,AVI只是一個容器,可以容納不同的音頻,視頻甚至隱藏式字幕編解碼器。另外,here是Zeranoe針對Windows的FFmpeg版本。你可以在你的文件的編解碼器內容的更多信息,如果您做到以下幾點:

ffmpeg -i guitarplaying.avi 

你應該看到的輸出,看起來像這樣:

ffmpeg version 0.8.7.git, Copyright (c) 2000-2011 the FFmpeg developers 
    built on Dec 6 2011 09:20:43 with gcc 4.6.1 
    configuration: --pkg-config=pkg-config --enable-gpl --enable-version3 --enable 
-nonfree --enable-runtime-cpudetect --enable-memalign-hack --enable-postproc --a 
rch=x86 --target-os=mingw32 --cross-prefix=i686-w64-mingw32- --prefix=/home/wluc 
as/ffmpeg-cross/build/deploy --enable-libx264 --enable-libvpx --enable-zlib --en 
able-bzlib --enable-libxvid --enable-libfaac --enable-libmp3lame --enable-libvor 
bis --enable-libtheora --enable-libopenjpeg --enable-libfreetype 
    libavutil 51. 30. 0/51. 30. 0 
    libavcodec 53. 40. 0/53. 40. 0 
    libavformat 53. 24. 0/53. 24. 0 
    libavdevice 53. 4. 0/53. 4. 0 
    libavfilter 2. 51. 0/2. 51. 0 
    libswscale 2. 1. 0/2. 1. 0 
    libpostproc 51. 2. 0/51. 2. 0 
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '..\..\Videos\Sintel\sintel_trailer-720p 
.mp4': 
    Metadata: 
    major_brand  : isom 
    minor_version : 512 
    compatible_brands: isomiso2avc1mp41 
    creation_time : 1970-01-01 00:00:00 
    title   : Sintel Trailer 
    artist   : Durian Open Movie Team 
    encoder   : Lavf52.62.0 
    copyright  : (c) copyright Blender Foundation | durian.blender.org 
    description  : Trailer for the Sintel open movie project 
    Duration: 00:00:52.20, start: 0.000000, bitrate: 1165 kb/s 
    Stream #0:0(und): Video: h264 (High) (avc1/0x31637661), yuv420p, 1280x720, 
1033 kb/s, 24 fps, 24 tbr, 24 tbn, 48 tbc 
    Metadata: 
     creation_time : 1970-01-01 00:00:00 
     handler_name : VideoHandler 
    Stream #0:1(und): Audio: aac (mp4a/0x6134706D), 48000 Hz, stereo, s16, 126 
kb/s 
    Metadata: 
     creation_time : 1970-01-01 00:00:00 
     handler_name : 

所以,你可以看到這個.MP4容器有一個H.264視頻編解碼器和一個AAC音頻編解碼器。

+1

爲了擴展第一點:人們經常犯圖像文件(avi,jpg等)與源代碼放在同一個文件夾,而不是編譯程序相同的文件夾。 – SSteve

+0

這描述了問題,但不是解決方案。 @ nimcap的答案解釋瞭如何簡潔準確地解決問題。 –

+0

我複製了opencv_ffmpeg310.dll,opencv_ffmpeg310x64.dll,問題解決了。非常感謝。 – mesutpiskin

46

缺少OpenCV的ffmpeg.dll不會在OpenCV 2.3.1中生成任何警告/錯誤,並且代碼無提示失敗。確保你的路徑中有正確的opencv_ffmpeg * .dll。

+0

這也困擾了我幾個小時,直到我看到了這個答案 –

+0

我有這個確切的問題;無論使用什麼編碼器,只要將該DLL複製過來,就無法加載。 –

+0

非常感謝!我試圖修復視頻編解碼器以及在可執行文件查找ffmpeg dll時在我的機器上呈現視頻的代碼。 – Kartos

4

可能加載了錯誤的lib file.Just喜歡我,我會得到相同的問題。但我可以打開AVI文件在VC6.0中使用opencv版本1.0。最後,我發現我使用了錯誤的lib。

在調試模式下,但我用opencv_core220.libopencv_highgui220.lib。而我opencv_core220d.libopencv_highgui220d.lib取代它們。現在我可以讀取它。

1

在OpenCV的2.4.4:只有opencv_ffmpeg244.dll(發佈DLL),而不是opencv_ffmpeg244d.dll(調試DLL)

在發佈編譯模式,試試吧!

+1

我有同樣的缺少DLL問題。 「發佈」版本適用於調試和發佈模式。 – cbuchart

1

我也遇到同樣的問題。使用VideoCapture的示例代碼,我的visual studio程序無法打開任何視頻文件。那麼,nimcap的建議適合我。 「缺少OpenCV的ffmpeg.dll不會在OpenCV 2.3.1中產生任何警告/錯誤,並且代碼會自動失敗。請確保您的路徑中包含正確的opencv_ffmpeg * .dll。」

解決方法:將opencv_ffmpeg.dll複製到我的visual studio項目/Debug文件夾中,我可以使用VideoCapture打開幾乎任何視頻文件。

0

Windows x64,你不必重命名任何東西。只需在您的PATH中輸入以下內容:... \ opencv \ build \ x64 \ vc12 \ bin

0

正是從這個更改代碼:

VideoCapture capture("guitarplaying.avi"); 

這樣:

CvCapture *input_video = cvCreateFileCapture("guitarplaying.avi"); 
-1

打開D:\OpenCV\build\x64\vc14\bin和複製opencv_ffmpeg320.dllopencv_ffmpeg320_64.dll根據您Windows (x86 or x64)這是與您有關。

opencv_ffmpeg320.dll - >爲32-bit Windows (x86)

opencv_ffmpeg320_64.dll - >爲64-bit Windows (x64)

粘貼複製.dllC:\Python27\或者是從Windows PATH環境變量訪問的任意位置。

或者,您可以創建一個文件夾D:\OpenCV\vendor\並將.dll文件添加到該文件夾​​,然後將D:\OpenCV\vendor\添加到您的windows environment variables

0

因爲我花了比我想承認的更多的時間,所以我只是補充一點。無法打開文件導致大量奇怪的例外。

如果您發現絕對路徑可以工作,而相對路徑不起作用,另一件要檢查的是確保工作目錄正確設置。

在Visual Studio中,這是項目屬性(配置屬性) - >調試 - >工作目錄。當我真的想要「$(OutDir)」時,我發現我的默認設置爲「$(ProjectDir)」。

相關問題