2010-11-03 23 views
6

Hace poco intenté actualizar las bibliotecas ffmpeg que uso en mi aplicación Mac OS X descargando y compilando ffmpeg desde el código fuente.Problema de compilación ffmpeg: avcodec_find_decoder siempre devuelve nulo

Mi código funciona correctamente con bibliotecas precompiladas de la misma versión en Windows. En Mac OS X, la biblioteca parece funcionar (puede abrir el archivo y encontrar las secuencias y los códecs utilizados), pero cuando llega a avcodec_find_decoder, esta función siempre devuelve nulo.

El código ha trabajado con una versión anterior de la biblioteca (compilado hace un año en Mac OS X 10.5)

he configurado fmpeg usando

./configure --extra-cflags="-arch i386" --extra-ldflags='-arch i386' --arch=x86_32 --target-os=darwin --enable-cross-compile --disable-indev=jack --enable-shared --disable-static 

yo nos registramos config.mak, y parece tener los decodificadores para los tipos de archivos que intenté habilitar (ogg, vorbis, avi, mkv, ...) También verifiqué que se habían utilizado los archivos de encabezado correctos y que se usaba la biblioteca recién compilada.

he encontrado solamente algunas entradas más antiguas relacionadas con este tema, pero sin ningún tipo de solución:

http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/2007-January/021399.html

http://libav-users.943685.n4.nabble.com/avcodec-find-decoder-problem-td944800.html

Editar: comprobación Además, parece av_codec_next (NULL) devuelve un valor nulo, así , lo que significa que no hay un solo códec disponible, o que first_avcodec en utils.c no está configurado (en realidad no he encontrado en absoluto donde se establece esta variable, habría supuesto av_register_all, pero no puedo encontrarlo) allí)

Respuesta

7

He encontrado una solución para mi problema, aunque todavía estaría interesado si alguien puede ayudarme con una explicación de mi problema.

Básicamente, estaba llamando solo a av_register_all() en la parte superior de mi función. Ahora cuando agrego avcodec_register_all() después de esto, mi código funciona nuevamente. No entiendo por qué, porque avcodec_register_all() debería ser llamado por av_register_all() desde el código fuente.

Ver http://www.ffmpeg.org/doxygen/trunk/allformats_8c-source.html#l00039 para el código fuente

0

en av_register_all():

static int initialized; 
if (initialized) 
    return; 
initialized = 1; 
avcodec_register_all(); 

Tal vez debido a algunos factores inadvertidos, el static int variable "iniciada" se ha inicializado mientras que el avcodec no se ha registrado ... Entonces deberíamos llamar a avcodec_register_all() para cumplirlo explícitamente. Pero me inclino a pensar que es un error en ffmpeg.

+0

Eso sí parece un error. No creo que el estándar c garantice que la inicialización será 0? Entonces estática int inicializada = 0; sería la forma correcta de hacerlo. – Adion

+0

@Adion Sí, el estándar C inicializa las variables estáticas int en ceros si no se inicializan explícitamente. Sin embargo, [aquí] (http://stackoverflow.com/questions/1294772/does-gcc-automatically-initialize-static-variables-to-zero) dice más ... – Daniel

+0

Ok, ya no llamo a avcodec_register_all(), entonces todo lo que estaba mal parece haberse arreglado en los 5 años desde que hice la pregunta. – Adion

Cuestiones relacionadas