2011-12-07 16 views
17

acabo escribió un simple ejemplo de vídeo de lectura con openCV2.3.1, pero parece que no se puede abrir vídeo AMV todos modos :(¿Por qué no puedo abrir video avi en openCV?

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

Hice un punto de interrupción en std::cout<<"cannot read video!\n" y encontrar que se detuvo aquí cada vez. Así ¿por qué el vídeo AVI no se puede abrir? Gracias!

+1

AVI es un formato de archivo, no un formato de video. Por lo tanto, debe verificar que el video esté codificado en un formato de video admitido, ya que un archivo AVI puede estar codificado de diferentes maneras. – Macmade

Respuesta

4

1)
Asegúrese de que el archivo de vídeo es en realidad en la misma carpeta que la aplicación (estoy asumiendo que ya ha intentado esto), de otro modo la absoluta camino.

2)
Si estás en Windows, es posible que necesite un paquete de códecs para leer el archivo de vídeo (por ejemplo, K-Lite Codec Pack).

Como sugirió Macmade, AVI es simplemente un contenedor que puede albergar diferentes códecs de audio, video o incluso de subtítulos. Además, here son compilaciones FFmpeg de Zeranoe para Windows. Puede obtener más información sobre el contenido de códec de su archivo si lo hace lo siguiente:

ffmpeg -i guitarplaying.avi 

Debería ver una salida que se parece a esto:

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 : 

Por lo tanto, como se puede ver este contenedor .mp4 tiene un códec de video H.264 y un códec de audio AAC.

+1

Para ampliar el punto 1: las personas a menudo cometen el error de colocar el archivo de imagen (avi, jpg, etc.) en la misma carpeta que su código fuente en lugar de la misma carpeta que el programa compilado. – SSteve

+0

Esto describe el problema, pero no la solución. La respuesta de @nimcap explica cómo solucionarlo de forma concisa y precisa. –

+0

Copio el archivo opencv_ffmpeg310.dll, opencv_ffmpeg310x64.dll y el problema fue resuelto. Muchas gracias. – mesutpiskin

46

Falta un ffmpeg.dll de OpenCV no genera advertencias/errores en OpenCV 2.3.1, y el código falla silenciosamente. Asegúrese de tener el opencv_ffmpeg * .dll adecuado en su ruta.

+0

Esto me atormentó por un par de horas también, hasta que vi esta respuesta –

+0

Tuve este problema exacto; no importa qué codificador use, no se cargará hasta que copie esa DLL. –

+0

¡Gracias una tonelada! Estaba tratando de arreglar los codecs de video y el código para renderizar el video en mi máquina cuando el ejecutable estaba buscando el ffmpeg dll. – Kartos

4

Puede ser que cargue el file.Just lib mal como yo, tengo la misma problema.Pero puedo abrir el archivo AVI en VC6.0 que usa la versión 1.0 de opencv. Finalmente, encuentro que utilizo la lib incorrecta.

en modo de depuración, pero yo uso opencv_core220.lib y opencv_highgui220.lib .Y les reemplazar con opencv_core220d.lib y opencv_highgui220d.lib .Now puedo leerlo.

1

En OpenCV 2.4.4: sólo hay opencv_ffmpeg244.dll (DLL liberación) y no opencv_ffmpeg244d.dll (DLL de depuración)

así que trata en modo de compilación de liberación!

+1

He tenido el mismo problema DLL faltante. La versión "versión" me funciona tanto en los modos de depuración como de versión. – cbuchart

1

También encuentro el mismo problema. Con el código de muestra para VideoCapture, mi programa de estudio visual no pudo abrir ningún archivo de video. Entonces, la sugerencia de nimcap funciona para mí. "Un archivo ffmpeg.dll de OpenCV que falta no genera advertencias/errores en OpenCV 2.3.1 y el código falla silenciosamente. Asegúrese de tener el archivo opencv_ffmpeg * .dll adecuado en su ruta".

Solución: Copie opencv_ffmpeg.dll a mi proyecto visual studio /Debug carpeta, puedo abrir casi cualquier archivo de video con VideoCapture.

0

En Windows x64, no es necesario cambiar el nombre de nada. Simplemente coloque el siguiente ... \ opencv \ build \ x64 \ vc12 \ bin en su RUTA.

0

Sólo cambia el código de esto:

VideoCapture capture("guitarplaying.avi"); 

a esto:

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

abierto D:\OpenCV\build\x64\vc14\bin y copiar el opencv_ffmpeg320.dll o opencv_ffmpeg320_64.dll que es relevante para usted basado en su Windows (x86 or x64).

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

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

Pegue el copiado .dll-C:\Python27\ o cualquier ubicación que es accesible desde Windows PATH variables de entorno.

Como alternativa, puede crear una carpeta D:\OpenCV\vendor\ y añadir .dll archivo a esa carpeta y luego añadir D:\OpenCV\vendor\ a su windows environment variables.

0

Estoy agregando esto porque pasé más tiempo del que me gustaría admitir. No poder abrir el archivo causó una tonelada de extrañas excepciones.

Si encuentra que las rutas absolutas funcionan, mientras que las rutas relativas no funcionan, otra cosa que debe verificar es asegurarse de que el directorio de trabajo esté configurado correctamente.

En Visual Studio esto es Propiedades del proyecto (Propiedades de configuración) -> Depuración -> Directorio de trabajo. Encontré el mío establecido en "$ (ProjectDir)" de forma predeterminada cuando realmente quería "$ (OutDir)".