web-dev-qa-db-fra.com

Pourquoi ne puis-je pas ouvrir une vidéo AVI dans openCV?

Je viens d'écrire un exemple de lecture vidéo simple avec openCV2.3.1, mais il semble que je ne puisse pas ouvrir la vidéo avi de toute façon :(

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();

J'ai fait un point d'arrêt dans std::cout<<"cannot read video!\n" et constate que cela s'arrêtait ici à chaque fois. Alors pourquoi la vidéo avi ne peut pas être ouverte? Merci!

21
yvetterowe

1)
Assurez-vous que le fichier vidéo se trouve bien dans le même dossier que l'application (je suppose que vous avez déjà essayé), sinon spécifiez le chemin absolu.

2)
Si vous utilisez Windows, vous aurez peut-être besoin d'un pack de codecs pour lire le fichier vidéo (par exemple, K-Lite Codec Pack ).

Comme l'a suggéré Macmade, AVI est simplement un conteneur qui peut héberger différents codecs audio, vidéo ou même des sous-titres codés. En outre, ici sont les versions FFmpeg de Zeranoe pour Windows. Vous pouvez obtenir plus d'informations sur le contenu du codec de votre fichier si vous procédez comme suit:

ffmpeg -i guitarplaying.avi

Vous devriez voir une sortie qui ressemble à ceci:

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    :

Donc, comme vous pouvez le voir, ce conteneur .mp4 possède un codec vidéo H.264 et un codec audio AAC.

4
mevatron

Un ffmpeg.dll manquant d'OpenCV ne génère aucun avertissement/erreur dans OpenCV 2.3.1 et le code échoue en silence. Assurez-vous que vous avez bien opencv_ffmpeg * .dll sur votre chemin.

54
nimcap

Peut-être que vous chargez le mauvais fichier lib.Juste comme moi , J'obtiens le même problème.Mais je peux ouvrir le fichier AVI dans VC6.0 qui utilise la version opencv 1.0.Enfin , Je trouve que j'utilise la mauvaise lib.

En mode débogage , mais j'utilise opencv_core220.lib et opencv_highgui220.lib .Et je les remplace par opencv_core220d.lib et opencv_highgui220d.lib .Maintenant je peux le lire.

4
windey1988

Dans OpenCV 2.4.4: il n'y a que opencv_ffmpeg244.dll (release dll) et pas opencv_ffmpeg244d.dll (debug dll)

Essayez donc en mode compilation de version!

1
Ismax

Je rencontre également le même problème. Avec l'exemple de code pour VideoCapture, mon programme Visual Studio n'a pu ouvrir aucun fichier vidéo. Ensuite, la suggestion de nimcap fonctionne pour moi. "Un ffmpeg.dll d'OpenCV manquant ne génère aucun avertissement/erreur dans OpenCV 2.3.1, et le code échoue silencieusement. Assurez-vous que vous disposez du bon opencv_ffmpeg * .dll sur votre chemin."

Lösung: Copiez opencv_ffmpeg.dll à mon projet visuel de studio /Debug dossier, je peux ouvrir presque n'importe quel fichier vidéo avec VideoCapture.

1
Andrew

Modifiez simplement votre code à partir de ceci:

VideoCapture capture("guitarplaying.avi");

pour ça:

CvCapture *input_video = cvCreateFileCapture("guitarplaying.avi");
0
amhoes

Sous Windows x64, vous n'avez rien à renommer. Il suffit de mettre ce qui suit ...\opencv\build\x64\vc12\bin dans votre CHEMIN .

0
Tim Long

J'ajoute juste à cela depuis que j'ai passé plus de temps que je ne voudrais l'admettre. Ne pas pouvoir ouvrir le fichier a provoqué une tonne d'exceptions étranges.

Si vous trouvez que les chemins absolus fonctionnent, alors que les chemins relatifs ne fonctionnent pas, une autre chose à vérifier est de vous assurer que le répertoire de travail est correctement défini.

Dans Visual Studio, il s'agit des propriétés du projet (propriétés de configuration) -> Débogage -> Répertoire de travail. J'ai trouvé le mien réglé sur "$ (ProjectDir)" par défaut quand je voulais vraiment "$ (OutDir)".

0
Dane Bouchie