Contempo: Encodear con FFmpeg: H.264 + FLAC

Encodear con FFmpeg: H.264 + FLAC

Dejaré de lado a MEncoder, y usaré FFmpeg.

El año 2009 escribí unas guías sobre edición de video/audio con MEncoder, es de pelos, pero el proyecto está ahí abandonado, así que ahora (mayo 2013) comenzaré a usar FFmpeg, debido a que actualizan cada 3 meses, es multiplataforma, utiliza libavcodec, tiene sintaxis simples y es abierto. Todo esto se puede hacer en Ubuntuelementary OS y OS X, también gracias a algunas ayudas que me topé por ahí.

Calidad: H.264, CRF, 10bit y FLAC


H.264

Hace ya mucho tiempo que decidí ver todo en H.264/AVC, con su encoder abierto x264 se logra gran calidad y mejor compresión.

Constant Rate Factor (CRF)

Fijarse solo en el bitrate al encodear para limitar el peso de un video está mal. La gracia de la opción CRF en x264 es que solo se enfoca en mantener una calidad constante al video por medio de distribución de bitrates dependiendo de las escenas, él decidirá cuantos bits usar en cada imagen sin importar el peso del video y así mantener una calidad constante.

10bit

10bit brinda una mejor profundidad de color en un video H.264, el degradado de colores se ve más suave al redimensionar la imagen o encodear desde un blu-ray. 10bit también contribuye en disminuir el peso del video. Actualmente el uso de 10bit se ha popularizado en los encoders de Animes.

FLAC

La gracia del codec abierto FLAC es que no tiene pérdidas de calidad de audio. Debes usar una fuente de audio sin pérdidas (Lossless). Usa LPCM, DTS-HD MA y Dolby TrueHD, los cuales no traen pérdida de audio (lossless), utiliza esos para encodear a FLAC. DTS y Dolby Digital traen perdida (lossy), así que no encodeen desde esos dos.

Instalar x264-10bit y FFmpeg


Solo 10 bit: Se instalan 3 cosas, instalar dependencias (+ yasm), x264, y FFmpeg (en ese orden), copiar/pegar en la terminal lo que aparece en los cuadros. Para compilar x264-10bit, al final de la linea "./configure" tienes que agregar: --bit-depth=10 (Antes de instalar FFmpeg, primero borra de la lista todos los encoders que no instalaste, como por ejemplo --enable-libfdk-aac, --enable-libmp3lame, etc.)

Solo 8 bit: Esto es más fácil, instala FFmpeg actualizado desde un PPA (otro PPA con FFmpeg, la última versión de x264 y Mkvtoolnix). Y listo, a encodear.

En OS X instala FFmpeg usando Homebrew. Y para agregar más encoders:
brew reinstall ffmpeg --with-faac --with-libvpx --with-x265 --with-opus

Uso básico FFmpeg


Especificar codec de salida

Si quieres especificar un codec, solamente agrega -c:v (para video) -c:a (para audio), y al lado el nombre del codec correspondiente, en este caso libx264 y flac:
ffmpeg -i entrada.mkv -c:v libx264 -c:a flac salida.mkv

Si quieres copiar el video o audio directamente, cambia el nombre de los codecs por copy:
ffmpeg -i entrada.mkv -c:v copy -c:a copy salida.mkv

Para ver el nombre de los encoders disponibles usa ffmpeg -encoders y para ver la lista de decoders con ffmpeg -decoders, para ver más opciones de configuración usa ffmpeg --help y la lista de todos los codecs con ffmpeg -codecs

Configurar CRF, Compresión y FLAC


Constant Rate Factor

CRF tiene un rango de medición de calidad entre 0 a 63 (en 10bit), siendo 0 lo mejor y 63 lo peor, entre más bajo el número de CRF más grande el tamaño del video. Se recomienda usar CRF entre 18 a 15 (por defecto usa 23). Si eres exigente y quieres mantener calidad en secuencias complejas, usa 15, si trae poco movimiento o imagen estática, usa 17. CRF utiliza una sola pasada constante, nada de dos pasadas, así quedaría -crf 15:
ffmpeg -i entrada.mkv -c:v libx264 -crf 15 -c:a copy salida.mkv

Compresión

Ahora hay que agregar un profile high10 (10bit) y un preset para comprimir en lento (slow), más lento (slower) o muy lento (veryslow), cada uno ajusta automáticamente las opciones de compresión, entre más lento más comprimido y mejor será el encodeo. Normalmente uso slow, no demora tanto en comprimir y prioriza la calidad (slow comprime de un 5 a 10% comparado al medium, slower agrega un 5% más a eso y veryslow un 3% más). No utilizo un "-level" específico, debido a que automáticamente le otorga uno dependiendo de la compresión. Si quisieran compatibilidad con un reproductor blu-ray o smart TV tendrían que poner "-level 4.1". Finalmente quedaría así: -preset slow -profile:v high10 (por defecto no agrega profile, usa preset medium y level automático):
ffmpeg -i entrada.mkv -c:v libx264 -crf 15 -preset slow -profile:v high10 -c:a copy salida.mkv

Modificar opciones x264

Opcionalmente si no quiere usar un preset, también puedes modificar parámetros específicos en la compresión de x264 + ffmpeg, por ejemplo modificar los bframes, me_method, refs, me_range, etc (solo recomendado para usuarios avanzados, y lee para que sirve cada uno, también su nombre al ponerlos con ffmpeg y en la documentación de ffmpeg). Unas modificaciones para mejorar el encodeo:
ffmpeg -i entrada.mkv -c:v libx264 -crf 15 -profile:v high10 -bf 8 -refs 8 -b_strategy 2 -me_range 24 -trellis 2 -subq 9 -me_method umh -deblock 1:-1:-2 -qcomp 0.80 -psy-rd 0.70:0.00 -rc-lookahead 120 -aq-strength 1.0 -c:a copy avanzado.mkv

Si quieres utilizar las opciones nativas de x264, hazlo con -x264opts. Con ello podrás modificar todas las opciones nativas existentes en x264:
ffmpeg -i entrada.mkv -c:v libx264 -crf 15 -profile:v high10 -x264opts bframes=8:ref=8:b-adapt=2:merange=24:trellis=2:subme=9:me=umh:deblock=1,-1,-2:qcomp=0.80:psy-rd=0.70,0.00:rc-lookahead=120:aq-strength=1.0 -c:a copy salida.mkv

Puedes agregar tune para optimizaciones de imágenes, en Animes usa -tune animation, con actores reales usa -tune film, con video granulado usa -tune grain. Por defecto no viene ni una activada, prueba primero y si no ves cambios positivos entonces no los uses (ve para que sirve cada una y que hacen):
ffmpeg -i entrada.mkv -c:v libx264 -tune animation -c:a copy salida.mkv

FLAC

Flac utiliza un rango de compresión de archivo entre 0 a 8 y el audio se mantiene sin pérdidas, siendo 0 menos comprimido y 8 más comprimido. Por defecto comprime en 5, así que no lo modifico. Se usa así -c:a flac -compression_level 8. FLAC soporta hasta 8 canales de audio y 32 bits de profundidad:
ffmpeg -i entrada.mkv -c:v copy -c:a flac salida.mkv

Como dato extra, puedes encodear los archivos de audio por separado (MP3/AAC/Vorbis/Opus/FLAC).

Y finalmente, si por ejemplo encodearamos un Anime con video H.264 en 10bit, CRF 15 y audio FLAC sería así (en este orden; crf, preset, tune y demás configuraciones):
ffmpeg -i entrada.mkv -c:v libx264 -crf 15 -preset slow -tune animation -profile:v high10 -c:a flac salida.mkv

Las demás opciones las dejé por defecto debido a que la mayoría son recomendables, una configuración simple pero buena a la vez, vean más opciones en ffmpeg --help y x264 --fullhelp.

BDMV (archivos Blu-ray)


Un BDMV (común en torrents, Share/PerfectDark) incluye todos los archivos del blu-ray, y archivos con contenedor .m2ts, ese archivo contiene el video y las múltiples pistas de audio dentro (PCM, True HD, DTS), usualmente el .m2ts más grande es el video principal.

Para extraer una pista determinada primero tienen que ver que pistas hay dentro.
ffmpeg -i video.m2ts 
Stream #0:0 Video: AVC
Stream #0:1 Audio: pcm_bluray
Stream #0:2 Audio: ac3 

Por ejemplo 0:0 sería el video a encodear, y 0:1 es la pista de audio lossless que queremos. Se usaría así: -map 0:0 -map 0:1 (y otras opciones recomendadas para encodear blu-ray).
ffmpeg -i entrada.m2ts -map 0:0 -c:v libx264 -crf 15 -preset slow -profile:v high10 -nal-hrd vbr -b-pyramid strict -slices 4 -aud 1 -map 0:1 -c:a flac salida.mkv

O también la configuración con opciones nativas recomendadas para encodear blu-ray con el uso de colores bt709:
ffmpeg -i entrada.m2ts -map 0:0 -c:v libx264 -crf 15 -preset slow -x264opts nal-hrd=vbr:b-pyramid=strict:slices=4:aud:colorprim=bt709:transfer=bt709:colormatrix=bt709 -map 0:1 -c:a flac salida.mkv

Extras: Resolución video, relación aspecto, recortar imagen, dividir/pegar video, extraer audio/video, info MKV, poner bitrate, FPS, captura pantalla/micrófono y cámara


Resolución video

Para bajar la resolución de imagen de un video (por ejemplo de 1920x1080 a 1280x720) se agrega -vf scale=ancho:alto o también -s:v ancho:alto. Nunca es recomendable subir la resolución, el upscaling queda mal. Cuidado con las supuestas resoluciones 1080p que no lo son, común en series de anime. Pero este método no respetaría el aspecto proporcional en algunos casos (los dos dan el mismo resultado):
ffmpeg -i entrada.mkv -c:v libx264 -vf scale=1280:720 -c:a copy salida.mkv 
ffmpeg -i entrada.mkv -c:v libx264 -s:v 1280:720 -c:a copy salida.mkv

Para redimensionar y mantener el aspecto proporcional usa -1 en el alto (no sirve en -s:v):
ffmpeg -i entrada.mkv -c:v libx264 -vf scale=1280:-1 -c:a copy salida.mkv

Para redimensionar aleatoriamente y que automáticamente se cree un aspecto proporcional que se ajuste a esa resolución (pero mejor intenta preservar el aspecto original):
ffmpeg -i entrada.mkv -c:v libx264 -vf scale=800:400,setsar=1:1 -c:a copy salida.mkv

Relación aspecto

Mejor conocido como Aspect Ratio, sirve para dar un aspecto proporcional al cuadro de la imagen, como por ejemplo 4:3/1.33 (pantallas de televisores CRT/SD), 3:2/1.5 (cámaras DSLR), 16:10/1.6 (monitor computador), 16:9/1.77 (HDTV), 1.85 (Cinema Film), y 2.35 o 2.39 (Cinemascope), ordenadas desde semicuadrada hasta rectangular. No es recomendable que retoques el aspecto proporcional original de un video, esto solo sirve para casos donde se recorta agresivamente la imagen o casos especiales. El filtro se pone como setdar, por ejemplo 16:9, aunque agregar directamente (sin filtro) -aspect 16:9 también sirve (los dos dan el mismo resultado):
ffmpeg -i entrada.mkv -c:v libx264 -vf setdar=16:9 -c:a copy salida.mkv 
ffmpeg -i entrada.mkv -c:v libx264 -aspect 16:9 -c:a copy salida.mkv

Recortar imagen

Sirve principalmente para recortar bordes negros e imperfecciones en la orilla de un video. El filtro crop=A:B:C:D se explica así: (A) Cortar ancho de la imagen, (B) Cortar alto de la imagen, (C) Mover imagen de derecha a izquierda, (D) Mover imagen de arriba a abajo. El siguiente ejemplo cortaría el alto (B) y movería arriba (D) para centrar un poco:
ffmpeg -i entrada.mkv -c:v libx264 -vf crop=1280:718:0:2 -c:a copy salida.mkv

Dividir y pegar videos

Para dividir partes de un video primero se pone la parte desde donde se extraerá (-ss) y luego el tiempo que se cortará (-t). Por ejemplo si quisieran cortar desde el segundo 30 unos 10 segundos (también se pueden agregar milisegundos para ser más precisos 00:00:10.500):
ffmpeg -ss 00:00:30 -i entrada.mkv -c:v copy -c:a copy -t 10 salida.mkv

Para volver a pegar varios videos usualmente sirve concat:
ffmpeg -i concat:"video1.avi|video2.avi|video3.avi" -c copy pegado.avi

Pero eso no sirve para los MKV, así que hay que instalar Mvktoolnix (versión actualizada), el cual trae mkvmerge. Con esto pega los videos en MKV:
mkvmerge video1.mkv + video2.mkv -o pegado.mkv

Extraer video/audio

Para extraer la pista 1 de audio hay que deshabilitar el video (-vn):
ffmpeg -i entrada.mkv -vn -map 0:1 -c:a copy audio.flac

Para extraer el video hay que deshabilitar el audio (-an):
ffmpeg -i entrada.mkv -c:v copy -an video.mkv

Para extraer solo el video sin que copie el subtitulo flotante (-sn):
ffmpeg -i entrada.mkv -c:v copy -an -sn video.mkv

Si quisiéramos extraer el video junto con una pista de audio determinada, por ejemplo el Stream #6 de audio (con "ffmpeg -i video.mkv" se puede saber el número de Stream):
ffmpeg -i entrada.mkv -map 0:0 -c:v copy -map 0:6 -c:a copy salida.mkv

Extraer con Mkvextract

Con mkvextract (incluido en mkvtoolnix) también se pueden extraer las pistas de video, audio y subtitulos (con mkvinfo se puede ver el número ID de cada pista):
mkvextract tracks video.mkv 0:video.mkv 1:audio.aac 2:subtitulo.srt

Unir video/audio y agregar más pistas de audio

Para unir video (sin audio) y el nuevo audio, en MKV se demora:
ffmpeg -i video.mkv -i audio.flac -c:v copy -c:a copy unido.mkv

Mkvmerge es ideal para adjuntar archivos a MKV, agrega el audio a la última pista, y es rápido:
mkvmerge video.mkv audio.flac -o unido.mkv

Para agregar múltiples pistas de audio y subtitulo:
mkvmerge video.mkv audio1.flac audio2.ac3 sub.srt -o unido.mkv

Agregar información video/audio

Después de agregar todas las pistas, se puede agregar información de idioma o título a las pistas, se usa --language id:lengua ("mkvmerge --list-languages" para ver la lista) y --track-name id:"Información". Con "mkvmerge -i video.mkv" se puede ver el ID de cada pista.
mkvmerge --language 1:eng --track-name 1:"Inglés FLAC 5.1" --language 2:spa --track-name 2:"Español AC3 5.1" --lenguage 3:spa --track-name 3:"Español SubRip" entrada.mkv -o salida.mkv

Poner bitrate

Si quieres un peso determinado o limitar los bits usa el bitrate, eso se puede ajustar con -b:v, adjuntando el numero del bitrate con una k de kBits o m de mBits al lado, los dos ejemplos brindan el mismo resultado, aunque k es más preciso:
ffmpeg -i entrada.mkv -c:v libx264 -b:v 4000k -c:a copy salida.mkv 
ffmpeg -i entrada.mkv -c:v libx264 -b:v 4m -c:a copy salida.mkv

Para audio agrega -b:a:
ffmpeg -i entrada.mkv -c:v copy -c:a libfaac -b:a 640k salida.mkv

FPS

Si queremos bajar los FPS, por ejemplo a 24 (23.976), se agrega -vf fps= (los dos ejemplos dan el mismo resultado):
ffmpeg -i entrada.mkv -c:v libx264 -vf fps=23.976 salida.mkv 
ffmpeg -i entrada.mkv -c:v libx264 -vf fps=24000/1001 salida.mkv

O entero pero sin subframes con -r:
ffmpeg -i entrada.mkv -c:v libx264 -r 24 salida.mkv

Grabar escritorio, audio micrófono/cámara

Para grabar todo el escritorio en video de alta calidad (salir: Q):
ffmpeg -f x11grab -s 1440x900 -framerate 30 -i :0.0 -c:v libx264 -qp 0 -preset ultrafast salida.mkv

Grabar audio desde el micrófono del notebook. O grabar video+audio desde la cámara del notebook (salir: Ctrl + C). Vean en alsamixer si tienen el micrófono en captura al 100 (Cambiar a captura alsamixer: TAB):
ffmpeg -f alsa -i pulse salida.wav 
ffmpeg -f video4linux2 -i /dev/video0 -f alsa -i pulse salida.mkv

Y varios filtros de ffmpeg para modificar video/audio (úsalos responsablemente). También hace tiempo escribí una guía sobre como encodear audio por separado. Para más ayuda vean la documentación completa de FFmpeg. También más cosas en la wiki para encodeo de x264. Algunas ayudas extras no oficiales que me topé por ahí. Un documento de x264 sobre las diferencias técnicas de 8bit y 10bit. Unas guías de la wiki para encodear diferentes cosas. La lista de opciones disponibles para x264 y su función.

Asegúrate de instalar el reproductor mpv. Utiliza Screenshot Comparison para subir capturas de video y comparar diferencias de imagen con tus encodeos. Utiliza Mediainfo para ver en detalle la información del video/audio (con vista HTML o por terminal es más detallado).