Почему я не могу открыть 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 видео не открывается? Спасибо!


person yvetterowe    schedule 07.12.2011    source источник
comment
AVI — это формат файла, а не видеоформат. Поэтому вам следует убедиться, что видео закодировано в поддерживаемом видеоформате, поскольку файл AVI может быть закодирован по-разному.   -  person Macmade    schedule 07.12.2011


Ответы (12)


1)
Убедитесь, что видеофайл действительно находится в той же папке, что и приложение (я предполагаю, что вы уже пробовали это), в противном случае укажите абсолютный путь.

2)
Если вы работаете в Windows, вам может понадобиться пакет кодеков для чтения видеофайла (например, K-Lite Codec Pack).

Как предположил Macmade, 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.

person mevatron    schedule 07.12.2011
comment
Чтобы расширить пункт 1: люди часто делают ошибку, помещая файл изображения (avi, jpg и т. д.) в ту же папку, что и их исходный код, а не в ту же папку, где находится скомпилированная программа. - person SSteve; 07.12.2011
comment
Это описывает проблему, но не решение. Ответ @nimcap объясняет, как это исправить кратко и точно. - person Johannes Brodwall; 10.08.2016
comment
Копирую opencv_ffmpeg310.dll, opencv_ffmpeg310x64.dll и проблема решилась. Большое спасибо. - person mesutpiskin; 06.10.2016

Отсутствующая ffmpeg.dll OpenCV не генерирует никаких предупреждений/ошибок в OpenCV 2.3.1, и код автоматически завершается ошибкой. Убедитесь, что у вас есть правильный opencv_ffmpeg*.dll в вашем пути.

person nimcap    schedule 08.12.2011
comment
Меня это тоже мучило пару часов, пока я не увидел этот ответ - person Ben Allison; 20.02.2013
comment
У меня была именно эта проблема; независимо от того, какой кодировщик я использовал, он не загружался, пока я не скопировал эту DLL. - person Doug Kavendek; 26.04.2013
comment
Благодаря тонну! Я пытался исправить видеокодеки и код для рендеринга видео на моей машине, когда исполняемый файл искал dll ffmpeg. - person Kartos; 12.06.2013
comment
в окнах вам нужно добавить правильную папку следующим образом: opencv\build\..\bin, откуда вы распаковали opencv, на свой путь. - person fastmultiplication; 27.07.2014
comment
+ все для этого. Это (я обнаружил) также в случае с привязками Java; вам понадобится FFmpeg dll в вашем пути к классам. - person Smalltown2k; 04.11.2014
comment
Я все еще не мог это исправить. Я потратил пару дней на это. Любая помощь будет оценена - person Vivekanand; 22.01.2016
comment
спас день для меня - person jwdmsd; 30.12.2018
comment
спас мой день, мужики. Спасибо - person petacreepers23; 27.08.2019

Возможно, вы загружаете неправильный файл библиотеки. Как и я, у меня такая же проблема. Но я могу открыть файл AVI в VC6.0, который использует opencv версии 1.0. Наконец, я обнаружил, что использую неправильную библиотеку.

В режиме отладки, но я использую opencv_core220.lib и opencv_highgui220.lib. И я заменяю их на opencv_core220d.lib и opencv_highgui220d.lib. Теперь я могу это прочитать.

person windey1988    schedule 28.08.2012

В OpenCV 2.4.4: есть только opencv_ffmpeg244.dll (выпуск dll), а не opencv_ffmpeg244d.dll (отладочная dll)

Так что попробуйте в режиме компиляции релиза!

person Ismax    schedule 22.07.2013
comment
У меня была такая же проблема с отсутствующей DLL. Релизная версия у меня работает как в режиме отладки, так и в режиме выпуска. - person cbuchart; 05.11.2013

Я также сталкиваюсь с той же проблемой. С примером кода для VideoCapture моей программе Visual Studio не удалось открыть ни один видеофайл. Тогда предложение nimcap работает для меня. «Отсутствующий ffmpeg.dll OpenCV не генерирует никаких предупреждений/ошибок в OpenCV 2.3.1, и код автоматически завершается сбоем. Убедитесь, что у вас есть правильный opencv_ffmpeg*.dll на вашем пути».

Решение: Скопируйте opencv_ffmpeg.dll в папку моего проекта Visual Studio /Debug, я могу открыть практически любой видеофайл с помощью VideoCapture.

person Andrew    schedule 15.05.2014

В Windows x64 ничего переименовывать не нужно. Просто поместите следующий ...\opencv\build\x64\vc12\bin в свой PATH.

person Tim Long    schedule 22.01.2015

Я просто добавляю к этому, так как я провел больше времени, чем хотел бы признать. Невозможность открыть файл вызвала массу странных исключений.

Если вы обнаружите, что абсолютные пути работают, а относительные пути не работают, еще одна вещь, которую нужно проверить, — это убедиться, что рабочий каталог установлен правильно.

В Visual Studio это Свойства проекта (Свойства конфигурации) -> Отладка -> Рабочий каталог. Я обнаружил, что по умолчанию у меня установлено значение «$ (ProjectDir)», когда я действительно хотел «$ (OutDir)».

person Dane Bouchie    schedule 15.10.2017

Для тех, кто не нашел решения: в режиме openCV4 и отладки выполните следующие действия:

Перейдите в opencv\build\x64\vc15\bin

Скопируйте opencv_videoio_ffmpeg440_64.dll в папку отладки вашего проекта.

person vahid sabet    schedule 14.03.2021

Вам нужно просто скачать Xvid для своей машины с xvid.org и все: http://www.xvid.org/Downloads.15.0.html

person mor.ch    schedule 05.05.2012

Просто измените свой код:

VideoCapture capture("guitarplaying.avi");

к этому:

CvCapture *input_video = cvCreateFileCapture("guitarplaying.avi");
person amhoes    schedule 11.07.2016

Откройте 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.

person razmik    schedule 04.05.2017

Если вы используете Ubuntu 16+, вы можете попробовать это:

pip установить opencv-python

person Sahli Simo    schedule 05.03.2019