Почему я не могу открыть avi-видео в openCV?
Я просто написал простой пример чтения видео с 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
1)
Убедитесь, что видеофайл находится в той же папке, что и приложение (я предполагаю, что вы уже пробовали это), иначе укажите абсолютный путь.
2)
Если вы находитесь в Windows, вам может потребоваться пакет кодеков для чтения видеофайла (например, K-Lite Codec Pack).
Как предположил Макмад, AVI - это просто контейнер, в котором могут размещаться разные аудио, видео или даже закрытые кодеки. Кроме того, здесь - это Zeranoe FFmpeg для Windows. Вы можете получить дополнительную информацию о содержимом вашего файла кодека, если выполните следующие действия:
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.
Ответ 2
Отсутствующий OpenCV ffmpeg.dll не генерирует никаких предупреждений/ошибок в OpenCV 2.3.1, а код терпит неудачу. Убедитесь, что у вас есть правильный opencv_ffmpeg *.dll в вашем пути.
Ответ 3
Возможно, вы загрузили неправильный файл lib. Как и я, я получаю ту же проблему. Но я могу открыть файл AVI в VC6.0, который использует opencv версию 1.0. Наконец, я считаю, что я использую неправильную библиотеку lib.
В режиме отладки, но я использую opencv_core220.lib
и opencv_highgui220.lib
. И я заменяю их на opencv_core220d.lib
и opencv_highgui220d.lib
. Теперь я могу прочитать его.
Ответ 4
В OpenCV 2.4.4: есть только opencv_ffmpeg244.dll(release dll), а не opencv_ffmpeg244d.dll(debug dll)
Итак, попробуйте в режиме компиляции релиза!
Ответ 5
Я также сталкиваюсь с той же проблемой. С образцом кода для VideoCapture моя визуальная студийная программа не смогла открыть какой-либо видеофайл. Тогда предложение nimcap работает для меня. "Отсутствующий OpenCV ffmpeg.dll не генерирует никаких предупреждений/ошибок в OpenCV 2.3.1, а код терпит неудачу. Убедитесь, что у вас есть правильный opencv_ffmpeg *.dll в вашем пути."
Скопируйте opencv_ffmpeg.dll в мою проектную проектную папку /Debug
, я могу открыть практически любой видеофайл с помощью VideoCapture.
Ответ 6
В разделе Windows x64 вам не нужно ничего переименовывать. Просто введите ...\opencv\build\x64\vc12\bin в PATH.
Ответ 7
Просто измените свой код:
VideoCapture capture("guitarplaying.avi");
:
CvCapture *input_video = cvCreateFileCapture("guitarplaying.avi");
Ответ 8
Я просто добавляю к этому, потому что я потратил больше времени, чем я хотел бы признать. Невозможность открыть файл вызвала массу странных исключений.
Если вы обнаружите, что работают абсолютные пути, а относительные пути не работают, необходимо проверить, правильно ли установлен рабочий каталог.
В Visual Studio это Свойства проекта (Свойства конфигурации) → Отладка → Рабочий каталог. Я установил мой набор в "$ (ProjectDir)" по умолчанию, когда мне действительно захотелось "$ (OutDir)".
Ответ 9
Вам нужно просто загрузить для вашего устройства Xvid из xvid.org, что все: http://www.xvid.org/Downloads.15.0.html
Ответ 10
Откройте D:\OpenCV\build\x64\vc14\bin
и скопируйте opencv_ffmpeg320.dll
или opencv_ffmpeg320_64.dll
, который подходит для вас на основе Windows (x86 or x64)
.
opencv_ffmpeg320.dll
→ для 32-bit Windows (x86)
opencv_ffmpeg320_64.dll
→ для 64-bit Windows (x64)
Вставьте скопированный .dll
в C:\Python27\
или любое место, доступное из переменных среды Windows PATH
.
В качестве альтернативы вы можете создать папку D:\OpenCV\vendor\
и добавить файл .dll
в эту папку, а затем добавить D:\OpenCV\vendor\
в свой windows environment variables
.