Comparativa codecs

He encontrado un cuadro que compara codecs de vídeo. La verdad es que solo muestra los principales y se deja algunos en el tintero como los Ogg Theora (libre), VP8-9 y H265.

Puede ser útil para hacerse la idea del consumo en Mb/s de cada uno y conocer otros datos como profundidad de bits o submuestreo de color.

Gracias David Kong.

 

Anuncios

blackEncoder: mi primera aplicación.

Acabo de subir a GitHub mi primer programa en Python. Un codificador de vídeo basado en ffmpeg y PyQt.

¿Qué diferencia a éste de otros conversores de vídeo? Que está programado para casos muy concretos por ser tareas que repetía con bastante frecuencia. Son presets que pueden facilitarnos la vida a quienes necesitemos insertar fotogramas en negro delante y detrás de un vídeo para prepararlo para emisión, añadir un timecode determinado, etc…

blackEncoder

He utilizado como IDE PyCharm y me ha gustado mucho. Creo que es de lo mejor. Intenté con Eclipse pero me costó más.

He aprendido mucho gracias a la ayuda de la gente en los foros. A utilizar variables “globales” o a usar subprocess para lanzar comandos externos a Python. En mi caso fundamental para conectar con ffmpeg.

He chequeado el programa en Linux con CentOs y Antergos y funciona bien. La verdad es que se agradece la libertad que ofrece Linux para programar, compilar y ejecutar los programas. El mundo del Open Source es una gozada en ese aspecto.

El problema es cuando lo he intentado en Mac. Entramos en el mundo de lo privativo, las condiciones y problemas.

Para poder tener y usar mi aplicación en Mac hay dos vías:

1  Volver a programar la aplicación en Swift con Xcode. Conseguir compilar la aplicación incluyendo el framework de ffmpeg y sus librerías.

2  Intentar ejecutar el script que he programado en Python.

Para esta segunda opción, si lo quiero hacer funcionar en Mac osX tendría que:

  • Instalar Xcode
  • Instalar Homebrew
  • Instalar ffmpeg
  • Instalar Python
  • Instalar PyQt

Ahora valoro más el trabajo del equipo de Handbrake, un codificador de vídeo open source basado en ffmpeg que ha conseguido implementarse para Mac y funciona muy bien.

Por tanto, queda pendiente:

  • Optimizar el código.
  • Utilizar excepciones (try – except) para lanzar errores.
  • Mejorar la barra de progreso.
  • Versión para Mac.

Mac Pro vs PC

 

Acabo de ver esta comparativa entre Mac Pro y HP Z840… sin comentarios. Los Benchmarks son incontestables. Como Apple no se ponga las pilas pronto, el mercado pro de la producción audiovisual se les va a la… competencia. Yo me incluyo.

Los últimos Mac Pros son del 2013. Dicen las malas lenguas que algunos procesos en vídeo son más rápidos con el Mac book pro.

De todas formas, hace tiempo que Apple perdió el interes por el sector profesional del vídeo.

The Pixellab es uno de los últimos estudios que han dado el salto al lado oscuro. Aquí nos lo cuentan.

 

Escalar vídeo con FFMpeg. Avanzado.

Hay formas sencillas para escalar un vídeo con FFMpeg:

ffmpeg -i input.mov -filter:vscale=1080:-1 output.mp4

Con -1 indicamos que conserve el aspecto (proporción) del original.

El problema viene cuando quiero escalar un vídeo dentro de una operación compleja de ffmpeg. Al usar, por ejemplo -filter_complex, no permite usar el cambio de escala de la manera normal.

Quería compartir este código que me ha costado bastante sacar a base de muchas pruebas y consultas en la web.

La idea era poder hacer un script para poder crear un vídeo con frames negros al comienzo y al final (esto es tema de una entrada anterior) y poderlo escalar al tamaño deseado. En este caso de 1920×1080 a 1280x 720

Para ello primero hay que indicar el tamaño que queremos en el generador de frames negros…

-f lavfi -i color=c=black:s=1280×720:r=25:d=1

… y luego escalar el vídeo que interesa dentro de -filter_complex

-filter_complex “[0:v] trim=start_frame=1:end_frame=5 [blackstart]; [0:v] trim=start_frame=1:end_frame=5 [blackend]; [2:v] scale=1280:-1 [scaled]; [1:a] atrim=duration=0.2 [audiostart]; [1:a] atrim=duration=0.2 [audioend];

Aquí el código completo:

ffmpeg -f lavfi -i color=c=black:s=1280×720:r=25:d=1 -f lavfi -i “aevalsrc=0:c=stereo:d=1” -i input.mov -filter_complex “[0:v] trim=start_frame=1:end_frame=5 [blackstart]; [0:v] trim=start_frame=1:end_frame=5 [blackend]; [2:v] scale=1280:-1 [scaled]; [1:a] atrim=duration=0.2 [audiostart]; [1:a] atrim=duration=0.2 [audioend]; [blackstart] [audiostart] [scaled] [2:a] [blackend] [audioend] concat=n=3:v=1:a=1[v][a]” -map “[v]” -map “[a]” -c:v libx264 -crf 22 -preset slow -profile:v high10 -pix_fmt yuv420p -c:a aac -strict -2 -b:a 128k -timecode 00:01:00:00 -tune zerolatency output.mp4

 

 

Pruebas con FFMPEG en Mac

ffmpeg

Quería compartir y comentar unas pruebas que he realizado con ffmpeg.

En realidad, lo hago para tener un documento que agrupe lo que he aprendido de FFMPEG y para que me sirva cuando todo esto se me olvide (posiblemente mañana).

Una de las cosas que más me interesaba era encontrar virtudes y aspectos que lo hicieran superior a otras aplicaciones de codificación de vídeo como Adobe Encoder, Compressor, HandBrake o MPEG Streamclip. Buscaba alguna carácterística que lo hiciera diferente al resto ya sea porque escala vídeo a más calidad, porque es más rápido o porque ofrece más calidad por menos peso de archivo. Las aplicaciones con las que comparo FFMPEG son muy buenas. Las he usado, trabajo con ellas a diario y hacen muy bien su trabajo.

compresordescargaencodermpeg

En este post no pretendo enseñar el manejo de FFMPEG ya que hay muchos recursos en la red. Lo que me interesa ahora es fijarme en sus características generales.

La primera gran diferencia es el entorno gráfico. Todas las aplicaciones son sencillas de usar y tienen un entorno gráfico que facilita el manejo. FFMPEG no tiene entorno gráfico y se opera desde el terminal. Por tanto la primera consideración es que es menos práctico y más complejo.

NOTA: Para instalar FFMPEG en Mac hay que instalar XCode y Homebrew. Hay muchas referencias en la red.

CODECS

El primer punto interesante es que admite y trabaja con casi todos los codecs conocidos. Al ser software de código abierto pensé que solo usaría codecs libres como en HandBrake pero en Mac trabaja bien con prores y puede multiplexar en .mov perfectamente.

En el caso de usar FFmpeg en Linux la cosa cambia porque no usa los codecs privativos de Apple y otras marcas. Por ejemplo, para H264 utiliza la librería libx264. Otros codecs de código abierto son mp4, VP8 y Theora

La lista de codecs es muy grande. Para verla:

ffmpeg -codecs

Para ver formatos:

ffmpeg -formats

En HandBrake solo se utilizan los formatos Matrioska .mkv y .mp4 y los codecs h264, h265 VP8 y Theora.

En Mac, FFMPEG puede emplear muchos codecs pero no puede exportar a prores 4444. Solo podremos exportar prores 422, no otros tipos de prores como HQ o 4444.

Lo que sí podemos es usar prores 4444 de entrada y pasarlo a cualquier otro formato o mantenerlo como está.

Ejemplo de paso de cualquier formato a prores:

ffmpeg -i INPUT.avi -c:v prores OUTPUT.mov

Si queremos trabajar en alta calidad en Mac hay muchas posibilidades. He probado hacer archivos .mov en Animation y funciona perfectamente:

ffmpeg -i INPUT -codec:v qtrle -codec:a copy OUTPUT.mov

Otra posibilidad es usar el v408. -c:v v408. Es un codec 444 muy bueno pero muy pesado. Un segundo de vídeo en prores 4444 pesa unos 35Mb, con -c:v qtrle (animation) pesa 133 Mb y con -c:v v408 pesa 215 Mb.

CALIDAD

Hay casos en los que queremos mantener la calidad del vídeo, no procesarlo, y simplemente añadirle un audio. Entonces tendremos que escribir -c:v copy. Con esta instrucción indicamos que el codec de vídeo se mantenga igual. Ej:

ffmpeg -i INPUT.mov -i AUDIO.aif -c:v copy -c:a copy OUTPUT.mov

Si queremos conservar la calidad de un vídeo podemos usar  –qscale 0. Es el sustituto, tal vez, del obsoleto -sameq

-qscale lo he probado con un archivo .mov Animation y he generado un .mpg de bastante calidad y mucho menos peso. Aparentemente parece no haber perdido calidad aunque sabemos que sí. El vídeo de 1s en Animation pesaba 117 Mb y el resultante en mpg es de 6Mb. Con algo más de banding (normal) en el mpg y cierta pérdida de calidad aunque aceptable para la pérdida de peso que supone.

ffmpeg -i INPUT.mov -qscale 0 OUTPUT.mpg

Animation .mov:

test_animation.Still001

.mpg:

test_mpg.Still001

Otras opciones interesantes relacionadas con la calidad de la imagen y audio:

-hq  Activa los settings high quality

-c:v  -c:a o -codec:v -codec:a Dos formas de forzar el codec que utilizará de salida.

-pix_fmt Formato del pixel. Introduciendo este código podemos ver listado de opciones: ffmpeg -pix_fmts

Si trabajamos en Mac con FFMPEG es importante incluir en las conversiones que hagamos a H264, la opción -pix_fmt yuv420p ya que eso nos permite que el vídeo resultante se pueda ver en Quick Time sin problemas. Si no hacemos esto solo lo podremos ver en VLC. Como dicen por ahí: “…make sure the pixel format is compatible with dumb players”

-qp 0 Máxima calidad. En mis pruebas va de 0 a 70, a partir de 70 no comprime más. Se usa como opción lossless

-b:v o -b:a Bit rate para vídeo y audio. Tasa de bits o tasa de transferencia.

Para H264 podemos codificar en CBR o VBR (bit rate o tasa de bits constante o variable) para ello usamos -crf  en constante o -pass 1 y -pass 2 si queremos hacer la codificación de dos pasadas en bit rate variable.

La diferencia entre constante o variable es que con VBR se optimiza más la compresión a base de comparar los cambios en la película y lo hace en uno o dos pases (mejor 2), por lo tanto, conseguimos la misma calidad con menos peso. Si no nos importa lo que ocupe el archivo usaremos CBR.

Ojo a lo que dicen los de Adobe:

“Al comparar archivos CBR y VBR del mismo contenido y del mismo tamaño, puede hacer las siguientes generalizaciones: Un archivo CBR se puede reproducir con más fiabilidad en una gama de sistemas más amplia porque la velocidad de datos fija exige menos del reproductor de medios y el procesador del equipo. Sin embargo, un archivo VBR suele tener una calidad de imagen superior porque VBR se adapta la cantidad de compresión al contenido de la imagen”

Con ambos métodos y teniendo settings similares, podemos conseguir la misma calidad. Sabemos que en VBR pesará menos, luego, a dos archivos que pesen igual, uno en CBR y otro en VBR, el de VBR tendrá más calidad.

Ejemplo usando tasa de transferencia constante.

ffmpeg -i INPUT.mov -c:v libx264 -crf 28 OUTPUT.mp4

La tasa de bits variable también es llamada ABR (Average bit rate)

Ejemplo sencillo de tasa de bits variable:

ffmpeg -i INPUT.mov -c:v libx264 -b:v 1000k OUTPUT.mp4

Con tasa mínima y máxima:

ffmpeg -i INPUT.mov -c:v libx264 -b:v 4000k -minrate 1000k -maxrate 4000k -bufsize 1835k out.mp4

Para codificar con tasa de bits constante en libx264 usaremos -crf de 0 a 51 siendo 0 la más alta calidad (lossless) y 51 la más baja. Normalmente se recomienda de 18 a 28. Si usamos -pix_fmt yuv420p no podremos usar -crf 0, tendremos que usar a partir de 1.

Para hacernos a la idea de tamaños, un vídeo de 1s con -cbf 18 pesa 2.2Mb, con -cbf 1 pesa 17Mb, con -cbf 28 pesa 896kb. 20s de vídeo con -cbf 18 son 61Mb, con -cbf 28 son 15Mb, con -cbf 40 son 4.2Mb.

Para comparar, en ffmpeg, un -cbf de 38-37 equivale en el Adobe Encoder a un CBR de 2Mbps.

En la red hay muchos ejemplos de codificación en h264 en tasa de bits constante y variable.

COMPRESIÓN DEL ARCHIVO/VELOCIDAD

Como he ido descubriendo, FFMPEG tiene muchísimas posibilidades y opciones.

Para optimizar la compresión de un vídeo existen presets que nos facilitan bastante el trabajo.

Los presets marcan la velocidad de codificación. Cuanto más lento, más y mejor comprime; el archivo será menos pesado. No afecta a la calidad. Tipos: ultrafast, superfast, veryfast, faster, fast, medium (the default), slow, slower, veryslow. Por tanto un ultrafast tendrá la misma calidad pero pesará más que un veryslow.

Ejemplo de un lossless en H264 multiplexado en Matrioska y preset rápido (pesará más):

ffmpeg -i INPUT.mov -c:v libx264 -preset ultrafast -qp 0 OUTPUT.mkv

Ejemplo de un lossless en H264 multiplexado en Matrioska y preset lento (pesará menos):

ffmpeg -i INPUT.mov -c:v libx264 -preset veryslow -qp 0 OUTPUT.mkv

Compruebo que FFMPEG es bastante rápido al codificar vídeo y audio. En términos generales creo que supera al Encoder, por lo menos en H264.

Ya que hablo de rapidez quiero comentar que me ha asombrado la velocidad con la que codifica FCPX en H264. Sin duda, creo que es el más rápido. Ni Premiere ni Encoder lo superan en esto.

FILTROS

Otro campo que conviene investigar son los filtros. Con ffmpeg -filters podremos ver el listado de filtros. Existe bastante documentación sobre el tema.

Esta es la lista de filtros que considero más interesantes:

Filters:
  T.. = Timeline support
  .S. = Slice threading
  ..C = Command support
  A = Audio input/output
  V = Video input/output
  N = Dynamic number and/or type of input/output
  | = Source or sink filter
 …       copy                 V->V       Copy the input video unchanged to the output.
 …       null                  V->V       Pass the source unchanged to the output.
 …      nullsink            V->|         Do absolutely nothing with the input video.
 …      concat           N->N       Concatenate audio and video streams.
 TS.     dctdnoiz           V->V       Denoise frames using 2D DCT.
 TS.     noise               V->V       Add noise.
 T..      hqdn3d            V->V       Apply a High Quality 3D Denoiser.
 T..     owdenoise       V->V       Denoise using wavelets.
 …       compand          A->A       Compress or expand audio dynamic range.
 T..      codecview        V->V       Visualize information about some codecs
 …       dejudder           V->V       Remove judder produced by pullup.
 …       deshake           V->V       Stabilize shaky video.
 …       field                  V->V       Extract a field from the input video.
 …       format              V->V       Convert the input video to one of the specified pixel formats.
 T..      gradfun            V->V       Debands video quickly using gradients.
 T..       il                     V->V       Deinterleave or interleave fields.
 …       interlace          V->V       Convert progressive video into interlaced.
 …       kerndeint         V->V       Apply kernel deinterlacing to the input.
 …       mcdeint           V->V       Apply motion compensating deinterlacing.
 T..     w3fdif               V->V       Apply Martin Weston three field deinterlace.
 TS.    yadif                 V->V       Deinterlace the input image.
 …       mpdecimate    V->V       Remove near-duplicate frames.
 …      palettegen        V->V       Find the optimal palette for a given stream.
 …      paletteuse        VV->V      Use a palette to downsample an input video stream.
 …      pixdesctest      V->V       Test pixel format definitions.
 …      split                  V->N       Pass on the input to N video outputs.
 …      scale                V->V       Scale the input video size and/or convert the image format.
 …      super2xsai       V->V       Scale the input by 2x using the Super2xSaI pixel art algorithm.
 .S.     xbr                   V->V       Scale the input using xBR algorithm.
 .S.      hqx                  V->V       Scale the input by 2, 3 or 4 using the hq*x magnification algorithm.
 .S.     signalstats       V->V       Generate statistics from video analysis.
 …      mandelbrot       |->V       Render a Mandelbrot fractal.
 …      mptestsrc         |->V       Generate various test pattern.
 …      smptehdbars    |->V       Generate SMPTE HD color bars.
 …      testsrc              |->V       Generate test pattern.
 …      avectorscope   A->V       Convert input audio to vectorscope video output.
 …      showcqt           A->V       Convert input audio to a CQT (Constant Q Transform) spectrum video output.
 …      showspectrum   A->V       Convert input audio to a spectrum video output.
Como se puede ver con los filtros tenemos muchas posibilidades. Estabilizar vídeo, añadir ruido, generar vectorscopios…
He probado los filtros de escalado para comprobar si alguna de las opciones utiliza un algoritmo milagroso que consigue ampliar la imagen sin pérdida alguna. He realizado la prueba con un vídeo pal ampliando a 2k. Lo he escalado con Adobe Encoder, con Mpeg Streamclip y con 4 métodos de escalado de FFMPEG. Ninguno es milagroso. Todos dan un resultado similar, incluido el Encoder. El único que destaca un poco es el procesado con Mpeg Streamclip porque parece que gana más de nitidez añadiendo algo de sharpen, pero es el que más rompe los colores. Por tanto no hay milagro. Aunque FFMPEG tiene un mínimo de 4 métodos de escalado, ninguno supera a Encoder.
Original en Pal
pal
Escalado con Encoder
encoder
Escalado con Mpeg Streamclip
mpegstreamclip
Escalado con FFMPEG scale
ff scale
Escalado con FFMPEG super2xsai
ff super2xsai
Escalado con FFMPEG xbr
ff xbr
Escalado con FFMPEG hqx
ff hqx
OTRAS OPCIONES
Al ser un programa abierto, las posibilidades son ilimitadas.
Podemos añadir pista de subtítulos, generar vídeo sin audio, hacerlo a partir de secuencia de imágenes, generar frames negros al comienzo de vídeo o al final, insertar textos, insertar un código de tiempo, rotar, escalar, cambiar aspecto, cropear, unir varios clips, separar las pistas de vídeo y audio…

PARA ACABAR YA DE UNA VEZ…

FFMPEG tiene muchas posibilidades. Podemos tener un control total en el proceso de codificación.

Calidad del vídeo de salida. No he encontrado diferencias en calidad de imagen con otras aplicaciones de codificación de vídeo. Utilizando bien los parámetros del Encoder podemos conseguir la misma calidad de vídeo que con FFMPEG. Posiblemente encontremos alguna diferencia en cuanto a velocidad de codificación entre las distintas aplicaciones pero dependerá de los parámetros que introduzcamos. La única ventaja de FFMPEG en cuanto a calidad es que podemos usar más parámetros para garantizar una calidad óptima.

Para usuarios de Mac que tienen posibilidad de usar Encoder o Compressor, la opción de uso de FFMPEG es incómoda y más lenta en la introducción de parámetros y no por ello consiguen mejores resultados. Aún así, hay funciones de FFMPEG como unir un vídeo y audio o insertar un timecode que se pueden realizar de manera más rápida y eficaz con FFMPEG.

Un aspecto importante para usuarios de Mac: FFMPEG es de código abierto y libre, por tanto, es accesible y podemos programar scripts en Mac que automaticen ciertas operaciones de FFMPEG. Entonces sí que FFMPEG se puede convertir en una herramienta rápida, cómoda y muy potente.

Si el usuario es de Linux la cosa está clara. FFMPEG es su mejor y más potente herramienta. No conozco ninguna aplicación con entorno gráfico, salvo HandBrake, que ofrezca buenas posibilidades y un buen control de los parámetros de codificación.

Como usuario de Debian y CentOs lo tengo claro.

Principales diferencias entre rolling shutter y global shutter.

Principales diferencias entre rolling shutter y global shutter.

 

Aquí el artículo V.O.

Lo traduzco y desarrollo con aportaciones mías.

Los sensores de imagen CCD, proporcionan un mecanismo obturador electrónico conocido como obturador global o global shutter. En cámaras que utilizan un obturador global, todo el sensor se reinicia antes de la captación para eliminar cualquier señal residual en los píxeles. Todos los píxeles del sensor captan la luz empezando y terminando exactamente al mismo tiempo. Al final del periodo de exposición (tiempo durante el cual se recoge la luz), todos los datos se transfieren de forma simultánea. Un protector de luz impide una mayor acumulación de carga durante el proceso de lectura.

Esto significa que con un sensor de obturador global o global shutter, la escena será “congelada” en el tiempo, siempre que el tiempo de exposición o captura sea lo suficientemente corta, es decir, no habrá movimiento borroso.

El rolling shutter se da en los sensores de imagen CMOS y funciona de forma diferente. Los fotodiodos (píxeles) no recogen la luz al mismo tiempo. La captación es como un barrido de líneas horizontales. El tiempo de inicio y de finalización de recogida de luz es ligeramente diferente para cada fila. La fila superior de la cámara es la primera en comenzar a recoger la luz y es la primera en terminar la recolección. El inicio y el final de la recogida de luz para cada fila siguiente se retrasa ligeramente. El tiempo total de recogida de luz para cada fila es exactamente el mismo y el retraso entre las filas es constante.

El tiempo de demora entre el restablecimiento de una fila y una fila que se lee es el tiempo de integración.

Dado que el proceso de captación de imagen con este sistema lleva un cierto periodo de tiempo, al trabajar con sensores CMOS y rolling shutter, los usuarios deben tener en cuenta la cuestiones siguientes:

Motion Blur
Se pueden producir efectos extraños o artefactos con ciertos movimientos.

 

Otra deformación en movimiento son los conocidos paneos horizontales que deforman la perspectiva o “efecto gelatina”.

Existen plugins que corrigen este defecto.

 

 

 

Captura de luz estroboscópica

No es muy adecuado para la captura de fuentes de luz de corto pulso tal como la luz estroboscópica. A menos que la fuente de luz permanece encendida durante la duración de la exposición, no hay garantía de que el ajuste de tiempo de obturación o la duración estroboscópica resulte adecuada para la correcta exposición.

 

Conviene tener en cuenta que estos defectos y otros que comentan en el artículo original sobre el rolling shutter, cada vez son menores y se van corrigiendo. Ejemplo de ello es la Canon C300 que tiene un sensor CMOS con velocidad de lectura más rápida, a 16 milisegundos en progresivo. Llega a corregir efectos indeseados como el efecto gelatina en movimientos horizontales o el moiré, incluso se consigue un ruido con valores ISO altos muy reducido.

 

MOX File format

Una buena noticia. Próxima aparición de un códec open source de vídeo profesional.

Gracias al crowdfunding, el programador Brendan Bolles y su equipo han conseguido desarrollar un códec abierto y compatible con Windows, Mac y Linux.

Mox utilizará el contenedor MXF y codecs open source como Dirac, OpenEXR, DPX, PNG y JPEG.

Esperemos que Adobe, Microsoft y Apple no pongan piedras en las ruedas de Mox…