私はopenCV2.3.1を使用して簡単なビデオ読み取りの例を作成しましたが、とにかく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)
ビデオファイルが実際にアプリケーションと同じフォルダーにあることを確認します(既に試したことがあると仮定しています)。それ以外の場合は絶対パスを指定します。
2)
Windowsを使用している場合、ビデオファイルを読み取るためにコーデックパックが必要になる場合があります(例: K-Lite Codec Pack )。
Macmadeが示唆したように、AVIは、さまざまなオーディオ、ビデオ、またはクローズドキャプションコーデックを収容できる単なるコンテナです。また、 here はWindows用のZeranoeの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オーディオコーデックが含まれています。
欠落しているOpenCVのffmpeg.dllは、OpenCV 2.3.1で警告/エラーを生成せず、コードはサイレントに失敗します。パスに適切なopencv_ffmpeg * .dllがあることを確認してください。
間違ったlibファイルをロードする可能性があります。私と同じように、同じ問題が発生します。しかし、opencvバージョン1.0を使用するVC6.0でAVIファイルを開くことができます。
デバッグモードでは、opencv_core220.lib
とopencv_highgui220.lib
を使用します。そして、それらをopencv_core220d.lib
とopencv_highgui220d.lib
に置き換えます。これで読み込めます。
OpenCV 2.4.4:opencv_ffmpeg244.dll(リリースdll)のみがあり、opencv_ffmpeg244d.dll(デバッグdll)はありません
だからリリースコンパイルモードで試してみてください!
私も同じ問題に遭遇します。 VideoCaptureのサンプルコードでは、Visual Studioプログラムでビデオファイルを開くことができませんでした。それから、nimcapの提案は私のために働く。 「OpenCVのffmpeg.dllがなくても、OpenCV 2.3.1で警告/エラーは生成されず、コードはサイレントに失敗します。パスに適切なopencv_ffmpeg * .dllがあることを確認してください。」
解決策:opencv_ffmpeg.dllをVisual Studioプロジェクトにコピーします/Debug
フォルダー、VideoCaptureでほぼすべてのビデオファイルを開くことができます。
これからコードを変更するだけです:
VideoCapture capture("guitarplaying.avi");
これに:
CvCapture *input_video = cvCreateFileCapture("guitarplaying.avi");
Windows x64では、名前を変更する必要はありません。次の...\opencv\build\x64\vc12\binを[〜#〜] path [〜#〜]に入れるだけです。
私が認めたい以上の時間を費やしたので、私はこれに追加しています。ファイルを開くことができないため、大量の奇妙な例外が発生しました。
絶対パスが機能するのに相対パスが機能しないことがわかった場合は、作業ディレクトリが適切に設定されていることを確認する必要があります。
Visual Studioでは、プロジェクトプロパティ(構成プロパティ)->デバッグ->作業ディレクトリです。 「$(OutDir)」が本当に必要なときに、デフォルトで「$(ProjectDir)」に設定されているものを見つけました。