⚠️ Este es un sitio de traducción no oficial, sin relación con el proyecto FFmpeg. Para información autorizada, consulte la página original (https://ffmpeg.org/faq.html).

FFmpeg FAQ (preguntas frecuentes)

1 Preguntas generales

1.1 ¿Por qué FFmpeg no admite la función [xyz]?

Porque todavía nadie se ha ocupado de esa tarea. El desarrollo de FFmpeg está impulsado por las tareas que resultan importantes para cada desarrollador. Si hay una función que le interesa, la mejor forma de conseguir que se implemente es encargarse usted mismo de la tarea o patrocinar a un desarrollador.

1.2 FFmpeg no admite el codec XXX. ¿Podrían incluir un cargador de DLL de Windows para admitirlo?

No. Las DLL de Windows no son portables, son voluminosas y a menudo lentas. Además, FFmpeg se esfuerza por admitir todos los codecs de forma nativa. Un cargador de DLL no ayuda a lograr ese objetivo.

1.3 No puedo leer este archivo aunque ffmpeg parece admitir este formato.

Aunque ffmpeg pueda leer el formato container, puede que no admita todos sus codecs. Consulte la lista de codecs admitidos en la documentación de ffmpeg.

1.4 ¿Qué codecs admite Windows?

Windows no admite bien formatos estándar como MPEG, a menos que instale algunos codecs adicionales.

La siguiente lista de codecs de vídeo debería funcionar en la mayoría de los sistemas Windows:

msmpeg4v2

.avi/.asf

msmpeg4

solo .asf

wmv1

solo .asf

wmv2

solo .asf

mpeg4

Solo si tiene instalado algún codec MPEG-4 como ffdshow o Xvid.

mpeg1video

solo .mpg

Tenga en cuenta que los archivos ASF suelen tener extensión .wmv o .wma en Windows. Cabe mencionar también que Microsoft reclama una patente sobre el formato ASF y puede demandar o amenazar a quienes creen archivos ASF con software que no sea de Microsoft. Se recomienda encarecidamente evitar ASF siempre que sea posible.

La siguiente lista de codecs de audio debería funcionar en la mayoría de los sistemas Windows:

adpcm_ima_wav adpcm_ms pcm_s16le

siempre

libmp3lame

Si tiene instalado algún codec MP3 como LAME.

2 Compilación

2.1 error: can't find a register in class 'GENERAL_REGS' while reloading 'asm'

Esto es un fallo de gcc. No nos informe a nosotros. Informe a los desarrolladores de gcc. Tenga en cuenta que no vamos a añadir soluciones alternativas para fallos de gcc.

Tenga en cuenta también que (algunos de) los desarrolladores de gcc creen que esto no es un fallo, o que no es un fallo que deban corregir: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=11203. Aunque, la verdad, algunos de ellos no distinguen un problema indecidible de un problema NP-difícil...

2.2 He instalado esta biblioteca con el gestor de paquetes de mi distribución. ¿Por qué configure no la detecta?

Las distribuciones suelen dividir las bibliotecas en varios paquetes. El paquete principal contiene los archivos necesarios para ejecutar programas que usan la biblioteca. El paquete de desarrollo contiene los archivos necesarios para compilar programas que usan la biblioteca. A veces la documentación o los datos están también en un paquete aparte.

Para compilar FFmpeg necesita instalar el paquete de desarrollo. Suele llamarse libfoo-dev o libfoo-devel. Puede eliminarlo una vez terminada la compilación, pero asegúrese de conservar el paquete principal.

2.3 ¿Cómo hago que pkg-config encuentre mis bibliotecas?

En algún lugar junto a sus bibliotecas hay un archivo .pc (o varios) en un directorio pkgconfig. Necesita definir variables de entorno para indicar a pkg-config dónde están esos archivos.

Si necesita añadir directorios a la lista de búsqueda de pkg-config (caso típico: biblioteca instalada aparte), añádalo a $PKG_CONFIG_PATH:

export PKG_CONFIG_PATH=/opt/x264/lib/pkgconfig:/opt/opus/lib/pkgconfig

Si necesita reemplazar la lista de búsqueda de pkg-config (caso típico: compilación cruzada), defínalo en $PKG_CONFIG_LIBDIR:

export PKG_CONFIG_LIBDIR=/home/me/cross/usr/lib/pkgconfig:/home/me/cross/usr/local/lib/pkgconfig

Si necesita conocer las dependencias internas de la biblioteca (uso típico: enlazado estático), añada la opción --static a pkg-config:

./configure --pkg-config-flags=--static

2.4 ¿Cómo uso pkg-config al hacer compilación cruzada?

Lo mejor es instalar pkg-config en su entorno de compilación cruzada. Así usará automáticamente las bibliotecas de compilación cruzada.

También puede usar el pkg-config del entorno anfitrión indicando explícitamente --pkg-config=pkg-config a configure. En ese caso, debe indicar a pkg-config los directorios correctos mediante PKG_CONFIG_LIBDIR, como se explicó en el punto anterior.

Como solución intermedia, puede colocar en su entorno de compilación cruzada un script que invoque al pkg-config del anfitrión con PKG_CONFIG_LIBDIR definido. El script podría ser así:

#!/bin/sh
PKG_CONFIG_LIBDIR=/path/to/cross/lib/pkgconfig
export PKG_CONFIG_LIBDIR
exec /usr/bin/pkg-config "$@"

3 Uso

3.1 ffmpeg no funciona; ¿qué está mal?

Pruebe a ejecutar make distclean en el directorio fuente de ffmpeg antes de compilar. Si esto no ayuda, consulte (https://ffmpeg.org/bugreports.html).

3.2 ¿Cómo codifico imágenes sueltas en vídeos?

Primero, renombre sus imágenes siguiendo una secuencia numérica. Por ejemplo, img1.jpg, img2.jpg, img3.jpg,... Después puede ejecutar:

ffmpeg -f image2 -i img%d.jpg /tmp/a.mpg

Fíjese en que ‘%d’ se sustituye por el número de la imagen.

img%03d.jpg representa la secuencia img001.jpg, img002.jpg, etc.

Use la opción -start_number para declarar un número inicial de la secuencia. Es útil si su secuencia no empieza en img001.jpg pero conserva un orden numérico. El siguiente ejemplo empezará en img100.jpg:

ffmpeg -f image2 -start_number 100 -i img%d.jpg /tmp/a.mpg

Si tiene un gran número de imágenes que renombrar, el siguiente comando puede aligerarle la tarea. El comando, con la sintaxis del shell bourne, crea enlaces simbólicos de todos los archivos del directorio actual que coincidan con *jpg hacia el directorio /tmp siguiendo la secuencia img001.jpg, img002.jpg, etc.

x=1; for i in *jpg; do counter=$(printf %03d $x); ln -s "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done

Si quiere ordenarlas empezando por la más antigua según la fecha de modificación, sustituya *jpg por $(ls -r -t *jpg).

Luego ejecute:

ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg

Se aplica la misma lógica a cualquier formato de imagen que ffmpeg pueda leer.

También puede usar cat para enviar imágenes a ffmpeg mediante una tubería:

cat *.jpg | ffmpeg -f image2pipe -c:v mjpeg -i - output.mpg

3.3 ¿Cómo codifico un vídeo en imágenes sueltas?

Use:

ffmpeg -i movie.mpg movie%d.jpg

El archivo movie.mpg usado como entrada se convertirá en movie1.jpg, movie2.jpg, etc...

En lugar de confiar en el reconocimiento automático del formato del archivo, también puede usar

-c:v ppm -c:v png -c:v mjpeg

para forzar la codificación.

Aplicando esto al ejemplo anterior:

ffmpeg -i movie.mpg -f image2 -c:v mjpeg menu%d.jpg

Tenga en cuenta que no existe ningún codec "jpeg". Use "mjpeg" en su lugar.

3.4 ¿Por qué se aprecia una ligera pérdida de calidad con la codificación multihilo de MPEG*?

En la codificación multihilo de MPEG*, los slices codificados deben ser independientes entre sí; de lo contrario, el hilo n tendría en la práctica que esperar a que termine el hilo n-1, así que es bastante lógico que haya una pequeña reducción de calidad. Esto no es un fallo.

3.5 ¿Cómo puedo leer desde la entrada estándar o escribir en la salida estándar?

Use - como nombre de archivo.

3.6 -f jpeg no funciona.

Pruebe ’-f image2 test%d.jpg’.

3.7 ¿Por qué no puedo cambiar la velocidad de fotogramas?

Algunos codecs, como MPEG-1/2, solo permiten un pequeño número de velocidades de fotogramas fijas. Elija un codec distinto con la opción de línea de comandos -c:v.

3.8 ¿Cómo codifico vídeo Xvid o DivX con ffmpeg?

Tanto Xvid como DivX (versión 4 en adelante) son implementaciones del estándar ISO MPEG-4 (tenga en cuenta que hay muchos otros formatos de codificación que usan este mismo estándar). Por tanto, use ’-c:v mpeg4’ para codificar en estos formatos. El fourcc predeterminado almacenado en un archivo codificado en MPEG-4 será ’FMP4’. Si quiere un fourcc distinto, use la opción ’-vtag’. Por ejemplo, ’-vtag xvid’ forzará que se almacene el fourcc ’xvid’ como fourcc de vídeo en lugar del predeterminado.

3.9 ¿Qué parámetros son buenos para codificar MPEG-4 de alta calidad?

’-mbd rd -flags +mv4+aic -trellis 2 -cmp 2 -subcmp 2 -g 300 -pass 1/2’; cosas que probar: ’-bf 2’, ’-mpv_flags qp_rd’, ’-mpv_flags mv0’, ’-mpv_flags skip_rd’.

3.10 ¿Qué parámetros son buenos para codificar MPEG-1/MPEG-2 de alta calidad?

’-mbd rd -trellis 2 -cmp 2 -subcmp 2 -g 100 -pass 1/2’, pero tenga cuidado, ’-g 100’ puede causar problemas con algunos decoders. Cosas que probar: ’-bf 2’, ’-mpv_flags qp_rd’, ’-mpv_flags mv0’, ’-mpv_flags skip_rd’.

3.11 El vídeo entrelazado se ve muy mal al codificarlo con ffmpeg, ¿qué está mal?

Debería usar ’-flags +ilme+ildct’ y quizá ’-flags +alt’ para material entrelazado, y probar ’-top 0/1’ si el resultado se ve realmente desordenado.

3.12 ¿Cómo puedo leer archivos DirectShow?

Si ha compilado FFmpeg con ./configure --enable-avisynth (solo posible en plataformas MinGW/Cygwin), puede usar como entrada cualquier archivo que DirectShow sepa leer.

Simplemente cree un archivo de texto "input.avs" con esta única línea...

DirectShowSource("C:\path to your file\yourfile.asf")

... y luego pase ese archivo de texto a ffmpeg:

ffmpeg -i input.avs

Para CUALQUIER otra ayuda sobre AviSynth, visite la página de AviSynth.

3.13 ¿Cómo puedo unir archivos de vídeo?

"Unir" archivos de vídeo es bastante ambiguo. La siguiente lista explica los distintos tipos de "unión" y señala cómo se abordan en FFmpeg. Unir archivos de vídeo puede significar:

  • Ponerlos uno detrás de otro: esto se llama _concatenar_los (en resumen: concat) y se aborda precisamente en este FAQ.
  • Ponerlos juntos en el mismo archivo, para que el usuario elija entre las distintas versiones (ejemplo: distintos idiomas de audio): esto se llama _multiplexar_los (en resumen: mux), y se hace simplemente invocando ffmpeg con varias opciones -i.
  • Para el audio, poner todos los canales juntos en un único flujo (ejemplo: dos flujos mono en un flujo estéreo): esto a veces se llama _fusionar_los (merge), y puede hacerse con el filtro amerge.
  • Para el audio, reproducir uno encima del otro: esto se llama _mezclar_los (mix), y puede hacerse fusionándolos primero en un único flujo y luego usando el filtro pan para mezclar los canales a voluntad.
  • Para el vídeo, mostrar ambos juntos, uno al lado del otro o uno encima de una parte del otro; puede hacerse con el filtro de vídeo overlay.

3.14 ¿Cómo puedo concatenar archivos de vídeo?

Hay varias soluciones, según las circunstancias exactas.

3.14.1 Concatenar usando el filtro concat

FFmpeg tiene un filtro concat diseñado específicamente para esto, con ejemplos en la documentación. Se recomienda esta operación si necesita volver a codificar.

3.14.2 Concatenar usando el demuxer concat

FFmpeg tiene un demuxer concat que puede usar cuando quiera evitar una recodificación y su formato no admita la concatenación a nivel de archivo.

3.14.3 Concatenar usando el protocolo concat (a nivel de archivo)

FFmpeg tiene un protocolo concat diseñado específicamente para esto, con ejemplos en la documentación.

Unos pocos containers multimedia (MPEG-1, MPEG-2 PS, DV) permiten concatenar vídeo con solo concatenar los archivos que los contienen.

Por tanto, puede concatenar sus archivos multimedia transcodificándolos primero a estos formatos privilegiados, usando después el humilde comando cat (o el igualmente humilde copy en Windows), y finalmente transcodificando de vuelta al formato que prefiera.

ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg
ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi

Además, puede usar el protocolo concat en lugar de cat o copy, lo que evita crear un archivo intermedio potencialmente enorme.

ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
ffmpeg -i concat:"intermediate1.mpg|intermediate2.mpg" -c copy intermediate_all.mpg
ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi

Tenga en cuenta que quizá necesite escapar el carácter "|", que tiene un significado especial en muchos shells.

Otra opción es usar tuberías con nombre (named pipes), si su plataforma lo permite:

mkfifo intermediate1.mpg
mkfifo intermediate2.mpg
ffmpeg -i input1.avi -qscale:v 1 -y intermediate1.mpg < /dev/null &
ffmpeg -i input2.avi -qscale:v 1 -y intermediate2.mpg < /dev/null &
cat intermediate1.mpg intermediate2.mpg |\
ffmpeg -f mpeg -i - -c:v mpeg4 -c:a libmp3lame output.avi

3.14.4 Concatenar usando audio y vídeo en bruto

De forma similar, el formato yuv4mpegpipe y los codecs de vídeo y audio en bruto (raw) también permiten la concatenación, y el paso de transcodificación es casi sin pérdida. Al usar varios yuv4mpegpipe, hay que descartar la primera línea de todos los flujos salvo el primero. Esto puede lograrse pasando el flujo por tail, como se ve a continuación. Tenga en cuenta que, al pasar por tail, debe usar el agrupamiento de comandos, { ;}, para que pase a segundo plano correctamente.

Por ejemplo, supongamos que queremos concatenar dos archivos FLV en un archivo output.flv:

mkfifo temp1.a
mkfifo temp1.v
mkfifo temp2.a
mkfifo temp2.v
mkfifo all.a
mkfifo all.v
ffmpeg -i input1.flv -vn -f u16le -c:a pcm_s16le -ac 2 -ar 44100 - > temp1.a < /dev/null &
ffmpeg -i input2.flv -vn -f u16le -c:a pcm_s16le -ac 2 -ar 44100 - > temp2.a < /dev/null &
ffmpeg -i input1.flv -an -f yuv4mpegpipe - > temp1.v < /dev/null &
{ ffmpeg -i input2.flv -an -f yuv4mpegpipe - < /dev/null | tail -n +2 > temp2.v ; } &
cat temp1.a temp2.a > all.a &
cat temp1.v temp2.v > all.v &
ffmpeg -f u16le -c:a pcm_s16le -ac 2 -ar 44100 -i all.a \
       -f yuv4mpegpipe -i all.v \
       -y output.flv
rm temp[12].[av] all.[av]

3.15 Al usar -f lavfi, el audio se vuelve mono sin motivo aparente.

Use -dumpgraph - para averiguar exactamente dónde se pierde la disposición de canales.

Lo más probable es que sea por culpa de auto-inserted aresample. Intente entender por qué se necesitó el filtro de conversión en ese punto.

El lugar más probable es justo antes de la salida, ya que -f lavfi actualmente solo admite S16 empaquetado (packed).

Después, inserte explícitamente el aformat correcto en el filtergraph, especificando el formato exacto.

aformat=sample_fmts=s16:channel_layouts=stereo

3.16 ¿Por qué FFmpeg no ve los subtítulos de mi archivo VOB?

VOB y algunos otros formatos no tienen una cabecera global que describa todo lo presente en el archivo. En su lugar, se espera que las aplicaciones exploren el archivo para averiguar qué contiene. Como los archivos VOB suelen ser grandes, solo se explora el principio. Si los subtítulos solo aparecen más adelante en el archivo, no se detectarán en un primer momento.

Algunas aplicaciones, incluida la herramienta de línea de comandos ffmpeg, solo pueden trabajar con los flujos detectados durante el análisis inicial; los flujos que se detectan más tarde se ignoran.

El tamaño del análisis inicial se controla mediante dos opciones: probesize (predeterminado: ~5 Mo) y analyzeduration (predeterminado: 5.000.000 µs = 5 s). Para que se detecte el flujo de subtítulos, ambos valores deben ser lo bastante grandes.

3.17 ¿Por qué se eliminó la opción -sameq de ffmpeg? ¿Qué usar en su lugar?

La opción -sameq significaba "same quantizer" (mismo cuantizador), y solo tenía sentido en un conjunto muy limitado de casos. Por desgracia, mucha gente la confundía con "same quality" (misma calidad) y la usaba en situaciones donde no tenía sentido: producía más o menos el efecto visible esperado, pero lo lograba de forma muy ineficiente.

Cada encoder tiene su propio conjunto de opciones para ajustar el equilibrio entre calidad y tamaño; use las opciones del encoder que esté utilizando para fijar el nivel de calidad que le resulte aceptable. Las más habituales para esto son -qscale y -qmax, pero conviene revisar la documentación del encoder que haya elegido.

3.18 Tengo un vídeo distorsionado (estirado), ¿por qué el escalado no lo corrige?

Muchos codecs y formatos de vídeo pueden almacenar la relación de aspecto del vídeo: es la proporción entre el ancho y el alto, ya sea de la imagen completa (DAR, display aspect ratio) o de cada píxel individual (SAR, sample aspect ratio). Por ejemplo, las pantallas EGA con resolución 640×350 tenían un DAR de 4:3 y un SAR de 35:48.

La mayoría de los procesos de imagen fija trabajan con píxeles cuadrados, es decir, SAR 1:1, pero muchos estándares de vídeo, sobre todo los de la era de transición de lo analógico a lo digital, usan píxeles no cuadrados.

La mayoría de los filtros de procesamiento de FFmpeg gestionan la relación de aspecto para evitar que la imagen se distorsione: el recorte (cropping) ajusta el DAR para mantener constante el SAR, y el escalado ajusta el SAR para mantener constante el DAR.

Si quiere estirar la imagen, o "deshacer" un estiramiento, necesita sobrescribir esa información con los filtros setdar or setsar filters.

No olvide examinar con atención el vídeo original para comprobar si la distorsión proviene de la propia imagen o de la información de relación de aspecto.

Por ejemplo, para corregir una captura EGA mal codificada, use los siguientes comandos: el primero para ampliar a píxeles cuadrados, el segundo para fijar la relación de aspecto correcta, o el tercero para evitar la transcodificación (puede que no funcione, según el formato, el codec, el reproductor o la fase de la luna):

ffmpeg -i ega_screen.nut -vf scale=640:480,setsar=1 ega_screen_scaled.nut
ffmpeg -i ega_screen.nut -vf setdar=4/3 ega_screen_anamorphic.nut
ffmpeg -i ega_screen.nut -aspect 4/3 -c copy ega_screen_overridden.nut

3.19 ¿Cómo ejecuto ffmpeg como tarea en segundo plano?

ffmpeg normalmente comprueba la entrada de la consola, esperando entradas como "q" para detenerse y "?" para mostrar la ayuda, mientras realiza sus operaciones. ffmpeg no tiene forma de detectar cuándo se está ejecutando como tarea en segundo plano. Al comprobar la entrada de la consola, esto puede hacer que el proceso que ejecuta ffmpeg en segundo plano se suspenda.

Para evitar esas comprobaciones de entrada y permitir que ffmpeg se ejecute como tarea en segundo plano, use la opción -nostdin al invocar ffmpeg. Esto es efectivo tanto si ejecuta ffmpeg en un shell como si lo invoca como proceso independiente mediante una API del sistema operativo.

Como alternativa, cuando ejecute ffmpeg en un shell, puede redirigir la entrada estándar a /dev/null (en Linux y macOS) o NUL (en Windows). Esta redirección puede hacerla tanto al invocar ffmpeg como desde un script de shell que llame a ffmpeg.

Por ejemplo:

ffmpeg -nostdin -i INPUT OUTPUT

o (en Linux, macOS y otros shells de tipo UNIX):

ffmpeg -i INPUT OUTPUT </dev/null

o (en Windows):

ffmpeg -i INPUT OUTPUT <NUL

3.20 ¿Cómo evito que ffmpeg se suspenda con un mensaje como suspended (tty output)?

Si ejecuta ffmpeg en segundo plano, puede que su proceso se suspenda. Puede aparecer un mensaje como suspended (tty output). La pregunta es cómo evitar que el proceso se suspenda.

Por ejemplo:

% ffmpeg -i INPUT OUTPUT &> ~/tmp/log.txt &
[1] 93352
%
[1]  + suspended (tty output)  ffmpeg -i INPUT OUTPUT &>

Pese al mensaje "tty output", el problema real es que ffmpeg normalmente comprueba la entrada de la consola cuando se ejecuta. El sistema operativo detecta esto y suspende el proceso hasta que pueda ponerlo en primer plano y ocuparse de él.

La solución es usar las técnicas adecuadas para indicar a ffmpeg que no consulte la entrada de la consola. Puede usar la opción -nostdin, o redirigir la entrada estándar con < /dev/null. Consulte la pregunta del FAQ ¿Cómo ejecuto ffmpeg como tarea en segundo plano? para más detalles.

4 Desarrollo

4.1 ¿Hay ejemplos que muestren cómo usar las bibliotecas de FFmpeg, en particular libavcodec y libavformat?

Sí. Consulte el directorio doc/examples del repositorio fuente, también disponible en línea en: https://github.com/FFmpeg/FFmpeg/tree/master/doc/examples.

Los ejemplos también se instalan de forma predeterminada, normalmente en $PREFIX/share/ffmpeg/examples.

También puede leer la Developers Guide de la documentación de FFmpeg. Como alternativa, examine el código fuente de alguno de los numerosos proyectos de código abierto que ya incorporan FFmpeg en (projects.html).

4.2 ¿Pueden admitir mi compilador C XXX?

Depende. Si su compilador cumple con C99, es probable que se acepten con gusto los parches para admitirlo, siempre que no contaminen el código fuente con #ifdefs propios del compilador.

4.3 ¿Se admite Microsoft Visual C++?

Sí. Consulte la sección Microsoft Visual C++ de la documentación de FFmpeg.

4.4 ¿Pueden añadir compatibilidad con automake, libtool o autoconf?

No. Estas herramientas son demasiado voluminosas y complican la compilación.

4.5 ¿Por qué no reescribir FFmpeg en C++ orientado a objetos?

FFmpeg ya está organizado de forma altamente modular y no necesita reescribirse en un lenguaje formalmente orientado a objetos. Además, muchos de los desarrolladores prefieren el C puro; les funciona bien. Para más argumentos sobre este asunto, lea "Programming Religion".

4.6 ¿Por qué los programas de ffmpeg carecen de símbolos de depuración?

El proceso de compilación crea ffmpeg_g, ffplay_g, etc., que contienen la información de depuración completa. Esos binarios se despojan de esa información (strip) para crear ffmpeg, ffplay, etc. Si necesita la información de depuración, use las versiones *_g.

4.7 No me gusta la LGPL, ¿puedo contribuir código bajo la GPL en su lugar?

Sí, siempre que el código sea opcional y pueda colocarse fácil y limpiamente bajo #if CONFIG_GPL sin romper nada. Así, por ejemplo, un nuevo codec o filtro estaría bien bajo GPL, mientras que una corrección de un fallo en código LGPL no lo estaría.

4.8 Estoy usando FFmpeg desde mi aplicación en C, pero el enlazador se queja de símbolos que faltan en las propias bibliotecas.

FFmpeg compila bibliotecas estáticas de forma predeterminada. En las bibliotecas estáticas las dependencias no se gestionan. Esto tiene dos consecuencias. La primera es que debe especificar las bibliotecas en orden de dependencia: -lavdevice debe ir antes que -lavformat, -lavutil debe ir después de todo lo demás, etc. La segunda es que también hay que especificar las bibliotecas externas que usa FFmpeg.

Una forma fácil de obtener la lista completa de bibliotecas necesarias en orden de dependencia es usar pkg-config.

c99 -o program program.c $(pkg-config --cflags --libs libavformat libavcodec)

Consulte doc/example/Makefile y doc/example/pc-uninstalled para más detalles.

4.9 Estoy usando FFmpeg desde mi aplicación en C++, pero el enlazador se queja de símbolos que faltan aunque parecen estar disponibles.

FFmpeg es un proyecto puramente en C, así que para usar las bibliotecas dentro de su aplicación C++ necesita indicar explícitamente que está usando una biblioteca C. Puede hacerlo envolviendo sus includes de FFmpeg con extern "C".

Consulte http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.3

4.10 Estoy usando libavutil desde mi aplicación en C++, pero el compilador se queja de que ’UINT64_C’ no se declaró en este ámbito

FFmpeg es un proyecto puramente en C que usa las funciones matemáticas de C99; para poder usarlas desde C++ debe añadir -D__STDC_CONSTANT_MACROS a sus CXXFLAGS

4.11 Tengo un archivo en memoria / una API distinta de open/read/ de libc, ¿cómo la uso con libavformat?

Tiene que crear un AVIOContext personalizado usando avio_alloc_context; consulte libavformat/aviobuf.c en FFmpeg y libmpdemux/demux_lavf.c en las fuentes de MPlayer o MPlayer2.

4.12 ¿Dónde está la documentación sobre ffv1, msmpeg4, asv1, 4xm?

consulte https://www.ffmpeg.org/~michael/

4.13 ¿Cómo entrego H.263-RTP (y otros codecs en RTP) a libavcodec?

Aunque resulte particular por estar orientado a redes, RTP es un container como cualquier otro. Hay que demuxear RTP antes de entregar la carga útil a libavcodec. Para este caso concreto, consulte la RFC 4629 para ver cómo debe hacerse.

4.14 AVStream.r_frame_rate es incorrecto, es mucho mayor que la velocidad de fotogramas real.

r_frame_rate NO es la velocidad de fotogramas media, sino la menor velocidad de fotogramas capaz de representar con precisión todas las marcas de tiempo. Así que no, no está mal si es mayor que la media. Por ejemplo, si tiene contenido mixto a 25 y 30 fps, r_frame_rate será 150 (el mínimo común múltiplo). Si busca la velocidad de fotogramas media, consulte AVStream.avg_frame_rate.

4.15 ¿Por qué make fate no ejecuta todas las pruebas?

Asegúrese de tener las muestras de fate-suite y de que la variable de Make SAMPLES, la variable de entorno FATE_SAMPLES o la opción --samples de configure estén definidas con la ruta correcta.

4.16 ¿Por qué make fate no encuentra las muestras?

¿Tiene por casualidad un carácter ~ en la ruta de las muestras, para indicar el directorio de inicio? Ese valor se usa de una forma que el shell no puede expandir, lo que hace que FATE no encuentre los archivos. Simplemente sustituya ~ por la ruta completa.

Alojamiento proporcionado por telepoint.bg