3 puntos por GN⁺ 2023-07-31 | 1 comentarios | Compartir por WhatsApp
  • ffmprovisr es un sitio de asistencia para generar comandos que permite a quienes tienen dificultades para escribir comandos de FFmpeg elegir una tarea y consultar un comando de ejemplo con explicaciones de cada flag
  • Las recetas desglosan elementos como archivos de entrada, códecs, filtros, mapeo de streams y contenedores de salida, principalmente alrededor de ffmpeg, ffplay y ffprobe
  • El alcance es amplio: desde remuxing/transcodificación hasta cortar y unir, subtítulos y marcas de agua, miniaturas y GIF, archivos de prueba, metadatos, checksums y reportes de QCTools
  • No tiene búsqueda propia, pero se indica un método para desplegar todas las recetas y luego encontrar las palabras clave necesarias con la búsqueda del navegador
  • Además de FFmpeg, también cubre herramientas como ripeo de CDDA, ImageMagick y flac, por lo que puede usarse como una colección práctica de comandos para flujos de trabajo de preservación digital

Qué ofrece ffmprovisr

  • ffmprovisr reduce la carga de tener que armar comandos de FFmpeg manualmente, ofreciendo comandos de ejemplo por tarea y explicaciones de las opciones
  • El usuario pulsa un botón de tarea para ir a un comando individual o a una lista de comandos relacionados, y luego revisa el comando de muestra y el comportamiento de cada flag
  • La página no tiene función de búsqueda propia; indica abrir todas las recetas y luego usar ctrl+f o cmd+f para buscar en el navegador
  • Como referencias básicas enlaza al sitio oficial de FFmpeg, las installation instructions de Reto Kromer, Command Line Crash Course y explainshell.com
  • La licencia es Creative Commons Attribution 4.0 International License

Forma básica de leer comandos de FFmpeg

  • Después de instalar FFmpeg, se lo invoca escribiendo ffmpeg en el símbolo del sistema
  • Los comandos suelen estar compuestos por pares de flags y valores
    • En -i input_file.ext, -i es el flag que especifica el archivo de entrada, e input_file.ext es el archivo objetivo
    • En -c:v prores, -c:v especifica la codificación del stream de video, y prores es el códec que se usará
  • El nombre del archivo de salida va al final del comando y se especifica mediante el nombre de archivo, sin un flag de salida aparte
  • ffmpeg guarda el video, mientras que ffplay puede reproducir el video generado sin guardarlo
    • Ejemplo para guardar barras SMPTE: ffmpeg -f lavfi -i smptebars=size=640x480 -t 5 output_file
    • Ejemplo para reproducir barras SMPTE: ffplay -f lavfi smptebars=size=640x480
    • El ejemplo de FFmpeg requiere -i, la duración de grabación -t 5 y un archivo de salida, pero el ejemplo de FFplay no requiere -i

Puntos de control para reducir errores

  • Hay que verificar que el archivo de salida se abra, se reproduzca y se vea y escuche como se esperaba
  • La extensión de salida debe coincidir con el códec previsto, y algunas extensiones hacen que FFmpeg use ciertos códecs de forma predeterminada
    • Por ejemplo, .mp4 puede configurarse de forma predeterminada con codificación H.264
  • "Error: No such file or directory" puede deberse a un directorio incorrecto, un error tipográfico, un espacio faltante o flags pegados de forma incorrecta
    • Para moverse a la carpeta Downloads en macOS, se usa cd $HOME/Downloads
    • Si un comando copiado y pegado parece correcto pero arroja un error, se recomienda volver a escribirlo directamente en la línea de comandos
  • "Could not find tag for codec" ocurre cuando se intenta hacer remuxing de un archivo que tiene códecs de audio o video incompatibles con la extensión de salida
    • Se puede transcodificar primero a un códec adecuado, o quitar -c copy cuando se tenga certeza de que la extensión codificará automáticamente con el códec correcto
  • "Killed" puede aparecer cuando el archivo supera la capacidad de memoria del servidor
    • En servidores remotos, puede resolverse aumentando la capacidad de memoria
    • En servidores locales, conviene mantener FFmpeg actualizado y no ejecutarlo al mismo tiempo que otros programas que consuman mucha memoria
  • Si al usar filtros aparece "Error splitting argument list: option not found", hay que revisar si se están usando comillas y el formato del grafo de filtros
  • Como los filtros requieren recodificar los streams, pueden causar problemas si se usan junto con -c copy, que copia directamente los streams del archivo

Grafos de filtros, mapeo de streams y códecs predeterminados

  • Al ejecutar trabajos por lotes de FFmpeg dentro de un bucle, se puede poner -nostdin antes de la entrada para sobrescribir el comportamiento predeterminado de interacción con la entrada estándar
    • Ejemplo: ffmpeg -nostdin -i input_file ...
  • FFmpeg configura automáticamente códecs y valores predeterminados de parámetros de códec según el formato del archivo de salida
    • .avi: audio mp3, video mpeg4
    • .mkv: audio ac3, video H.264
    • .mov: audio AAC, video H.264
    • .mp4: audio AAC, video H.264
    • .mpg: audio mp2, video mpeg1video
    • .mxf: audio pcm_s16le, video mpeg2video
    • .wav: audio pcm_s16le
  • Un grafo de filtros es una combinación de nombres de filtros y opciones que viene después de -vf o -af
    • -vf es un alias de -filter:v
    • Un ejemplo de filtro de video es hflip, y un ejemplo de filtro de audio es amerge
    • Varios filtros se conectan con comas, y varias cadenas de filtros se separan con punto y coma
    • -vf "fieldmatch,yadif,decimate" es una única cadena de filtros usada para el procesamiento inverse telecine
    • Si hay más de una entrada o salida, se debe usar -filter_complex en lugar de -vf
    • Se deben usar comillas rectas y evitar las comillas curvas
  • El mapeo de streams define cuáles de los streams de video, audio, subtítulos, datos y adjuntos del archivo de entrada se incluirán en la salida
    • FFmpeg reconoce los tipos de stream a, v, s, d y t
    • -map 0:v selecciona todos los streams de video del primer archivo de entrada
    • -map 0:3 selecciona el cuarto stream del primer archivo de entrada
    • -map 0:a:2 selecciona el tercer stream de audio del primer archivo de entrada
    • Si no se especifica ningún mapeo, el valor predeterminado para un archivo de video es llevar a la salida solo 1 stream de video y 1 stream de audio
    • Para mapear todos los streams, se usa -map 0
    • Si se agrega ?, como en -map 0:a?, los archivos sin audio también pueden procesarse por lotes sin errores

Cambio de contenedor y transcodificación

  • El reempaquetado de archivos se realiza con ffmpeg -i input_file.ext -c copy -map 0 output_file.ext
    • Traslada los datos internos de video, audio y subtítulos a otro formato de contenedor sin modificarlos
    • El reempaquetado también se conoce como remuxing o re-multiplexing
    • Hay que usar -map 0 para conservar todos los streams, como múltiples pistas de audio
    • Algunos contenedores solo pueden incluir ciertas codificaciones de stream, por lo que puede no ser posible reempaquetar sin recodificar
  • La creación de Broadcast WAV registra el chunk BEXT y los metadatos relacionados con -write_bext 1 y -metadata field_name='Content'
    • Los campos usados con frecuencia son description, originator, originator_reference, origination_date, origination_time, coding_history e IARL
    • Los campos de metadatos BWF tienen límites de cantidad de caracteres, y OriginatorReference tiene un máximo de 32 caracteres
  • Al reempaquetar video con códec DV en un archivo .dv, se usa -f rawvideo -c:v copy para evitar que los metadatos de origen dentro del stream DV se eliminen accidentalmente
  • Un ejemplo de transcodificación a Apple ProRes LT es -c:v prores -profile:v 1 -vf yadif -c:a pcm_s16le
    • Los perfiles ProRes 422 se distinguen como 0 Proxy, 1 LT, 2 Standard y 3 HQ
    • FFmpeg admite como contenedores ProRes QuickTime .mov, Matroska .mkv y MXF .mxf
  • Un ejemplo de transcodificación a H.264 es -c:v libx264 -pix_fmt yuv420p -c:a aac
    • Los valores predeterminados de libx264 son el preset medium y CRF 23
    • -pix_fmt yuv420p especifica submuestreo de croma 4:2:0 para compatibilidad con QuickTime y la mayoría de los reproductores no basados en FFmpeg
    • Para optimización de streaming, se agrega -movflags +faststart
    • Un ejemplo de mayor calidad es -preset veryslow -crf 18, y CRF 18 suele considerarse “visualmente sin pérdidas”
  • La codificación H.264/H.265 basada en GPU Nvidia usa h264_nvenc o hevc_nvenc
    • El hardware de función fija de Nvidia puede ofrecer 10 veces el rendimiento de la codificación por CPU, pero se requieren más parámetros para optimizar la calidad a bajo bitrate
    • HEVC se describe como un códec más eficiente, compatible con GPU aproximadamente desde 2015
  • La transcodificación H.265/HEVC usa -c:v libx265 -pix_fmt yuv420p -c:a copy
    • Los valores predeterminados de libx265 son el preset medium y CRF 28
    • CRF 28 en H.265 corresponde a CRF 23 en H.264, y el tamaño de archivo puede reducirse aproximadamente a la mitad
  • Un ejemplo sin pérdidas para preservación consiste en colocar FFV1 Version 3 en un contenedor Matroska y generar también el framemd5 de entrada
    • -map 0 mapea todos los streams
    • -dn excluye streams de datos que Matroska no permite
    • -slicecrc 1 agrega información CRC para que el decodificador pueda detectar slices dañados
    • -f framemd5 -an genera checksums MD5 por cada frame de video

Cambio de propiedades de video y audio

  • La receta para cambiar la relación de aspecto usa el filtro de padding
    • Al convertir 4:3 a 16:9, se aplica pillarbox
    • Al convertir 16:9 a 4:3, se aplica letterbox
    • En videos sin audio, se puede usar -an en lugar de -c:a copy
  • Un ejemplo para convertir SD a HD usa tres filtros: colormatrix=bt601:bt709, scale=1440:1080:flags=lanczos y pad=1920:1080:240:0
    • Cambia los coeficientes de luminancia de Rec. 601 a Rec. 709
    • El escalado Lanczos es más lento que el bilinear predeterminado, pero ofrece mejores resultados
    • Para fuentes entrelazadas, se recomienda desentrelazar con yadif antes de escalar
  • La relación de aspecto de visualización puede cambiarse a nivel de contenedor con una opción como -aspect 4:3
    • Si se usa con -c:v copy, afecta la relación de aspecto almacenada en el contenedor, no la relación de aspecto dentro de los frames codificados
  • La conversión de espacio de color usa el filtro colormatrix=src:dst
    • Los valores permitidos incluyen bt601, smpte170m, bt470bg, bt709 y bt2020
    • Para incrustar metadatos de espacio de color se usan -color_primaries, -color_trc y -colorspace
    • Hay que tener cuidado, porque también se le pueden poner etiquetas Rec.709 a un archivo que en realidad es Rec.601
    • Las etiquetas de metadatos las escriben libx264 o libx265, por lo que no se pueden agregar sin recodificar
  • El cambio de velocidad usa setpts y atempo en conjunto
    • El ejemplo crea una copia de aproximación PAL que cambia 24 fps a 25 fps manteniendo el pitch del audio
  • Para fades se usan los filtros fade y afade; debido al uso de filtros, hay que recodificar el video y el audio
  • La extracción de audio usa -c:a copy -vn para extraer sin pérdidas el stream de audio sin video
  • La combinación de dos pistas de audio usa amerge y -filter_complex
    • Puede ser útil para procesos posteriores que esperan una sola pista de audio, como los subtítulos automáticos de YouTube
    • Para confirmar las pistas deseadas, se recomienda ejecutar ffprobe antes de escribir el script
  • Para análisis y normalización de volumen se usa el filtro loudnorm
    • La salida JSON puede usarse como valores de entrada para una normalización de 2 pasadas
    • Se describe que los valores predeterminados encajan bien con el objetivo de volumen recomendado por PBS
    • 1 pasada es más rápida, pero menos precisa que 2 pasadas
  • También se incluyen recetas para CD pre-emphasis, RIAA equalization, remuestreo de audio y forzar la interpretación de un WAV de 192 kHz como 96 kHz

Cortar, unir y segmentar

  • Para unir archivos con las mismas especificaciones técnicas se usa el concat demuxer
    • ffmpeg -f concat -i mylist.txt -c copy output_file
    • Los archivos a unir deben tener el mismo códec y las mismas especificaciones técnicas, y el archivo resultante debe previsualizarse obligatoriamente
    • Para usar rutas absolutas, se agrega -safe 0
  • Para unir archivos de distintos formatos o códecs se usa el filtro concat con -filter_complex
    • Los archivos de entrada pueden diferir en contenedor, códec, submuestreo de croma, framerate, etc.
    • El ejemplo básico solo funciona correctamente si tienen la misma resolución
    • Si los framerates son distintos, la salida puede ser de framerate variable
    • Si las resoluciones son distintas, se ajustan con scale antes de concat; al unir SD y HD, se puede aplicar pillarbox al SD
  • La división de archivos se maneja con el segment muxer
    • -segment_time 60 genera segmentos de hasta 60 segundos
    • %03d crea nombres de archivo con números de 3 dígitos rellenados con ceros
  • El recorte sin recodificación usa -ss, -to, -t, -c copy y -map 0
    • Los códecs interframe como H.264 pueden comenzar en el punto más cercano basado en un i-frame
    • -sseof -5 es una forma de copiar desde 5 segundos antes del final del archivo
  • Para eliminar el silencio del inicio de un archivo de audio se usa silenceremove=start_threshold=-57dB:start_duration=1:start_periods=1
    • -57dB se presenta como un nivel adecuado para considerar el hiss analógico
    • Debido al uso del filtro, el audio se recodifica
  • Para eliminar el silencio del final de un archivo de audio se procesa en el orden areverse, silenceremove, areverse
    • Como silenceremove es más adecuado para eliminar silencio al inicio, se invierte el audio y luego se vuelve a invertir

Procesamiento de video entrelazado

  • Al crear un archivo de acceso HD H.264 a partir de una fuente SD NTSC, se usan juntos yadif, scale, pad y format=yuv420p
    • yadif es un filtro de desentrelazado
    • scale=1440:1080:flags=lanczos ajusta la imagen a 1440x1080
    • pad=1920:1080:(ow-iw)/2:(oh-ih)/2 agrega padding a una entrada 4:3 para que encaje en un frame de salida 16:9
  • Un ejemplo general de desentrelazado es -vf "yadif,format=yuv420p"
    • format=yuv420p especifica submuestreo de croma 4:2:0 para compatibilidad de reproducción con H.264
    • Además de yadif, FFmpeg incluye los desentrelazadores bwdif, w3fdif, kerndeint y nnedi
  • El desentrelazado que separa campos en frames usa idet,bwdif,format=yuv420p
    • Se prefiere para preservar la cadencia visual de la fuente en videos entrelazados con mucho movimiento
    • idet detecta el orden de campos
    • bwdif genera por defecto un frame por cada campo
  • El inverse telecine usa fieldmatch,yadif,decimate
    • Revierte el pulldown 3:2 y restaura video entrelazado de 29.97 fps a la tasa de frames de 24 fps de la fuente de película original
    • Al aplicarlo a un archivo 29.97i, la tasa de frames de salida en realidad queda en 23.976 fps
  • Para cambiar el orden de campos se usa setfield=tff o setfield=bff
    • Como se usa un filtro de video, no se puede usar -c copy y es necesario recodificar
  • Para revisar el patrón de entrelazado, se analiza sin archivo de salida con ffmpeg -i input_file -filter:v idet -f null -

Marcas de agua, subtítulos, miniaturas, GIF

  • Las marcas de agua de texto se crean con el filtro drawtext
    • Se especifican las opciones fontfile, fontsize, text, fontcolor, alpha, x e y
    • x=(w-text_w)/2:y=(h-text_h)/2 la centra independientemente del tamaño del video
  • Las marcas de agua de imagen pueden ubicarse arriba a la derecha con overlay=main_w-overlay_w-5:5
  • El timecode incrustado usa las opciones timecode, box, boxcolor y rate de drawtext
    • El timecode inicial tiene el formato hh:mm:ss[:;.]ff
  • Para incrustar un archivo de subtítulos se usa -i subtitles_file -c copy -c:s mov_text
    • mov_text funciona en contenedores MP4 y MOV
    • Los formatos permitidos en el contenedor MKV son ASS, SRT y SSA
  • Una sola miniatura se extrae con -ss 00:00:20 -vframes 1 thumb.png
  • Para crear una miniatura cada 1 minuto, se usa -vf fps=1/60 out%d.png
  • Al crear un GIF a partir de una secuencia de imágenes, se usan image2, -framerate, -pattern_type glob y scale
  • Los GIF de alta calidad se generan en dos pasos
    • El primer comando crea una paleta personalizada con palettegen
    • El segundo comando aplica la paleta con paletteuse
    • Un método más simple es usar -vf "fps=10,scale=500:-1", pero el dithering se nota más y el tamaño del archivo es menor

Secuencias de imágenes, scopes, OCR

  • Al convertir una secuencia de imágenes en video sin comprimir de 10 bits, se usa -f image2 -framerate 24 -i input_file_%06d.ext -c:v v210
    • La tasa de frames predeterminada del demuxer image2 es 25 fps
    • %06d lee en orden ascendente nombres de archivo numéricos de seis dígitos
  • Al crear un video combinando una imagen y un archivo de audio, se usan -loop 1, -shortest y -vf scale=1280:720
    • Puede ser útil cuando se quiere subir un archivo de audio a plataformas como YouTube
  • Con ffplay -f lavfi y filtros se puede visualizar la profundidad de bits de audio, gráficos de decibeles, píxeles fuera del rango de broadcast y vectorscopes
  • tblend=all_mode=difference128 y hstack muestran lado a lado las diferencias temporales entre dos videos de entrada
  • xstack se usa para crear una ventana de salida que apila varias fuentes de video vertical u horizontalmente, y resulta útil para el mismo propósito que la ventana de salida usada en vrecord
  • El ejemplo de OCR usa el filtro ocr y drawtext para mostrar sobre el video el texto reconocido
  • La salida de datos de OCR se muestra en pantalla con una forma como ffprobe -show_entries frame_tags=lavfi.ocr.text -f lavfi -i "movie=input_file,ocr"

Metadatos, checksums y tareas de preservación

  • La extracción de metadatos técnicos se realiza con ffprobe -i input_file -show_format -show_streams -show_data -print_format xml
    • Además de XML, se pueden usar JSON y flat como formatos de salida
  • Para eliminar metadatos se usa -map_metadata -1 -c:v copy -c:a copy
    • El video y el audio se copian, pero los metadatos no
  • El procesamiento por lotes en Bash se realiza con archivos .sh y bucles for
    • Ejemplo: for file in *.mxf; do ffmpeg -i "$file" -map 0 -c copy "${file%.mxf}.mov"; done
    • El archivo .sh y los archivos .mxf a procesar deben estar en el mismo directorio, y se debe ejecutar desde ese directorio
    • Para procesamiento recursivo se puede usar find input_directory -iname "*.mxf" -exec ffmpeg -i {} -map 0 -c copy {}.mov \;
  • En Windows, el procesamiento por lotes se realiza con scripts .ps1 de PowerShell
    • El ejemplo crea una lista de archivos .mp4 y relapea cada archivo cambiando su extensión a .mkv
    • Para llamar a ffmpeg sin la ruta completa, debe estar configurado correctamente
  • La comprobación de errores de decodificador decodifica sin archivo de salida con ffmpeg -i input_file -f null - y muestra los errores en pantalla
  • La verificación de fixity de FFV1 Version 3 comprueba CRC checksum mismatch con -report -i input_file -f null -
    • Frame CRC está activado por defecto en FFV1 Version 3
  • El MD5 de video por frame se genera con -f framemd5 -an
  • El MD5 por grupos de muestras de audio se genera con asetnsamples=n=48000 -f framemd5 -vn
    • Se presenta como buena práctica hacer que la cantidad de grupos de muestras coincida con la frecuencia de muestreo del medio
    • De forma predeterminada, el audio se transcodifica a PCM de 16 bits y se genera el framemd5
  • El MD5 de streams se puede crear mapeando por separado los streams de video y audio con -map y usando -c copy -f md5
    • Se usa para verificar la integridad de la información A/V independientemente de los cambios en los metadatos del contenedor
  • streamhash genera hashes por stream para todos los streams
    • Es útil para hashear material mixed born-digital porque no hace falta saber cuántos streams hay ni cuáles son
  • Los reportes de QCTools generan .qctools.xml.gz usando ffprobe -f lavfi y signalstats, cropdetect, idet, psnr, ssim, ebur128, astats, entre otros
    • Se proporcionan comandos separados para archivos con audio y sin audio
  • La extracción de subtítulos cerrados EIA-608 Line 21 genera valores hex en CSV con el filtro readeia608 y ffprobe

Archivos de prueba y otros ejemplos de FFmpeg

  • Los videos de prueba se crean o reproducen con entradas lavfi como mandelbrot, smptebars, testsrc y smptehdbars
    • El ejemplo de Mandelbrot genera una salida H.264 de 1280x720, 25 fps y 10 segundos
    • El ejemplo de barras SMPTE genera una salida ProRes de 720x576, 25 fps y 10 segundos
    • La reproducción de barras SMPTE HD es ffplay -f lavfi -i smptehdbars=size=1920x1080
    • La reproducción de barras SMPTE VGA es ffplay -f lavfi -i smptebars=size=640x480
  • El audio de prueba con onda senoidal crea un archivo WAV con sine=frequency=1000:sample_rate=48000:duration=5 y pcm_s16le
  • El video de prueba que combina barras SMPTE y una onda senoidal de 1 kHz usa dos entradas lavfi y -c:v ffv1, -c:a pcm_s16le
  • El archivo de prueba dañado corrompe intencionalmente el contenido de los paquetes con -bsf noise=1 -c copy, sin dañar el contenedor
  • Conway's Game of Life se simula con ffplay -f lavfi life=..., y con ffmpeg y -t 5 se puede guardar un segmento
  • La comparación de similitud perceptual entre dos videos usa el filtro signature=detectmode=full:nb_inputs=2
  • El hash perceptual de un video de entrada genera un archivo XML con signature=format=xml:filename="output.xml"
  • Una secuencia de imágenes se puede reproducir directamente sin crear un video con ffplay -framerate 5 input_file_%06d.ext
  • La separación de pistas de audio y video usa -map 0:v:0 y -map 0:a:0
  • La fusión de pistas de audio y video combina el video del primer archivo con el audio del segundo usando -map 0:v -map 1:a -c copy
  • El archivo MPEG para crear una ISO destinada a acceso DVD se crea con -aspect 4:3 -target ntsc-dvd output_file.mpg, y requiere tener instalado dvdauthor
  • El CSV para detección de escenas basada en YDIF muestra los valores lavfi.signalstats.YDIF de ffprobe y signalstats
  • El head switching noise se puede ocultar dibujando una caja negra en la parte inferior del fotograma con drawbox=w=iw:h=7:y=ih-h:t=max
  • Para hacer streaming en vivo a un destino RTMP y grabar un MP4 local al mismo tiempo, se usa el muxer tee
    • Escala la entrada a un ancho de 1280 px y finaliza el stream después del tiempo especificado
    • El ejemplo incluye una nota de que se usó a diario durante unos 4 años para hacer streaming en vivo de un programa de TV real
  • La información sobre un decodificador, codificador, demuxer, muxer o filtro específico se consulta con ffmpeg -h type=name
    • Los ejemplos son encoder=libx264, decoder=mp3, muxer=matroska, demuxer=mov y filter=crop

Herramientas relacionadas presentadas junto con FFmpeg

  • Las herramientas de extracción de CDDA cubren la verificación del offset de la unidad de CD y la extracción precisa de CD de audio
    • Como distintos modelos de unidades de CD tienen posiciones de inicio de lectura diferentes, se necesita corregir el offset para verificar checksums del mismo contenido
    • La identificación de la unidad se puede consultar con cdda2wav -scanbus, cdda2wav y cdparanoia -vsQ
    • El offset se busca en Accurate Rip CD drive offset list
    • Como herramienta GUI para macOS se presenta XLD
  • La extracción con CD Paranoia usa cdparanoia -L -B -O [Drive Offset] [Starting Track Number]-[Ending Track Number] output_file.wav
    • -B es el modo batch, que divide automáticamente las pistas en archivos separados
  • Cdda2wav es una herramienta que usa la Paranoia library para extraer CD de audio con precisión
    • El comando de instalación con Homebrew es brew install cdrtools
    • El comando de ejemplo extrae todo el CD a un único WAV, consulta CDDB y genera un cue sheet
    • En macOS, se debe desmontar el CD antes de ejecutar el comando
  • CD emphasis se describe como un método de reducción de ruido que puede afectar algunos CD tempranos de la década de 1980 y CD prensados en Japón
    • La verificación de su presencia se realiza con cdda2wav -J o cdparanoia -Q
    • Para corregirlo durante la extracción con Cdda2wav, se agrega la bandera -T
  • ImageMagick es un conjunto de software libre y de código abierto para mostrar, convertir y editar archivos de imágenes ráster y vectoriales
    • Los comandos se invocan como comandos individuales, por ejemplo convert, montage y mogrify
    • La comparación de imágenes devuelve la cantidad de píxeles diferentes con compare -metric ae image1.ext image2.ext null:
    • La generación de miniaturas usa mogrify -resize 80x80 -format jpg -quality 75 -path thumbs *.jpg
    • La grilla de imágenes se crea con montage @list.txt -tile 6x12 -geometry +0+0 output_grid.jpg
    • La eliminación de EXIF usa mogrify -path ./stripped/ -strip *.jpg
  • La herramienta flac es una utilidad de transcodificación FLAC y manipulación de metadatos creada por el proyecto FLAC
    • Tiene la ventaja de poder incrustar metadatos foráneos como BWF frente a otras herramientas
    • Para convertir WAV a FLAC manteniendo los metadatos BWF, se usa flac --best --keep-foreign-metadata --preserve-modtime --verify input.wav
    • Para reconstruir el BWF original desde FLAC, se usa --decode en lugar de --best

1 comentarios

 
GN⁺ 2023-07-31
Comentarios de Hacker News
  • Un poco fuera de tema, pero creo que ffmpeg está entre el mejor software que se haya creado jamás.
    Un ingeniero talentoso como Fabrice Bellard es un enorme regalo para la comunidad FOSS, y en un unicornio valuado en unos 2.000 millones de dólares donde trabajé antes, una gran parte del producto también dependía de ffmpeg.

    • Entonces seguro donaron una cantidad bastante grande, ¿no?
      https://ffmpeg.org/donations.html
    • No es “Fabian Fabrice”, sino Fabrice Bellard.
      También creó QEMU, TCC, QuickJS y otros.
    • No hay nadie como él. No hay nadie en la misma liga que Fabrice Bellard, y ni siquiera parece haber alguien jugando el mismo juego :-)
      Hablando en serio, la cantidad de dispositivos que en cualquier momento dado ejecutan código escrito por él es verdaderamente absurda.
    • Como referencia, la “FF” de “FFmpeg” significa “fast forward”.
    • Me gusta ffmpeg, pero el rendimiento en ARM tiene que mejorar.
  • La línea de comandos de ffmpeg sigue siendo para arrancarse los pelos incluso con buenas guías, así que quiero recomendar VapourSynth.
    https://www.vapoursynth.com/
    Es una herramienta optimizada de filtrado de video estilo Python, pero es mucho más que eso: https://vsdb.top/
    Y StaxRip aprovecha muy bien ffmpeg, VapourSynth y decenas de codificadores y herramientas; por eso llego a reiniciar de Linux a Windows: https://github.com/staxrip/staxrip

    • Sería genial tener aunque sea un wrapper de ffmpeg con una mejor interfaz de línea de comandos.
      Es innecesariamente complejo, y quizá desde algún punto de vista toda la estructura tenga sentido, pero es inadecuado que para tareas muy comunes haya que conocer opciones que parecen conjuros mágicos.
      Debe haber decenas de alias de bash que reducen comandos de ffmpeg de 150 caracteres a dos palabras.
      ffprobe tampoco tiene sentido: el 99% de las veces uno lo ejecuta sin argumentos para ver rápido la duración, la resolución, el framerate y la cantidad de pistas de audio, pero el 99% de la salida son cosas totalmente irrelevantes como las opciones de compilación.
  • Materiales relacionados para ver:
    https://ffmpeg.guide/ — crear grafos de filtros complejos de FFmpeg de forma rápida y precisa
    https://www.hadet.dev/ffmpeg-cheatsheet/ — cortar, agregar fade in/out, escalar, concatenar, etc.

    • El comando para cortar del segundo enlace no fue ideal en mi experiencia.
      Por alguna razón desconocida, ffmpeg se comporta distinto según si las flags -ss y -t/-to van antes o después de -i, y en mi caso funcionó mejor ponerlas antes.
      El texto original tiene el mismo problema.
    • ffmpeg.guide se ve excelente, pero siento que ffmpeg mismo debería tener algo mejor.
      Es raro forzar un grafo no lineal dentro de una línea de comandos plana y lineal.
      Con una configuración JSON más detallada ya sería mucho mejor.
    • ffmpeg.guide es muy bueno. ¿Existe algo parecido para ImageMagick?
    • Simplemente usen ffmpeg-python.
  • Muy útil.
    Empecé a usar ChatGPT para crear comandos de ffmpeg, y es mucho más rápido y fácil encontrar lo que necesito.
    También hice una pequeña herramienta para poder hacerlo directamente desde la línea de comandos: https://github.com/alexkrkn/help-cli
    También hice un video relacionado: https://www.youtube.com/watch?v=pOda6TDBqcY

  • Hace poco, buscando una UI para ffmpeg, descubrí Shutter Encoder, que es open source y un muy buen software compatible con mac/windows.
    Por fin empecé a comprimir mi colección personal de videos de 15 años, de 300 GB.
    https://www.shutterencoder.com/
    Estoy comprimiendo todo a H.265, y a veces el tamaño del video baja hasta 1/10. ¿Hay alguna razón para no hacerlo así? Leí que reproducir los videos comprimidos requiere más capacidad de procesamiento, pero no sé bien si eso será un gran problema en el futuro.

    • Probé aplicarlo automáticamente a una colección grande de videos, y aunque en los videos de prueba se veía bien, la configuración CRF era floja y la calidad quedó por debajo de lo esperado.
      Tómalo como una advertencia para verificar varios videos antes de borrar los originales.
      De todos modos, si son 300 GB, el almacenamiento es suficientemente barato como para simplemente conservar los originales.
    • Una razón para seguir eligiendo H.264 es que mucho hardware viejo o de gama baja no tiene decodificación por hardware de H.265.
      Además, para usarlo sin transcodificación en Plex, también me resulta más fácil así en mi homelab.
  • Esta guía recomienda yadif como filtro de desentrelazado, pero a mis ojos w3fdif se ve mejor.
    No hace seguimiento de movimiento como yadif, así que es bastante rápido y evita los artefactos molestos que a veces produce el seguimiento de movimiento.
    Creo que es mejor tener resultados consistentemente aceptables que resultados a veces excelentes y a veces malos.
    Además, a diferencia de yadif, que mira dos campos, w3fdif considera tres campos a la vez, por lo que oculta mejor los artefactos de entrelazado.

    • Hay una versión extendida de eso: https://github.com/HomeOfVapourSynthEvolution/VapourSynth-Bw...
      Si de todos modos vas a recodificar, conviene usar directamente QTGMC.
    • Como se mencionó antes, w3fdif fue reemplazado en general por bwdif.
      w3fdif puede producir parpadeo, pero yadif no, así que bwdif se comporta como yadif mientras usa el mejor emparejamiento de campos de w3fdif.
    • bwdif es un híbrido de yadif y w3fdif.
  • La mayor barrera para adoptar ffmpeg probablemente sean las herramientas offline premium freemium y los frontends web
    Esos sitios optimizan su SEO con frases que la gente suele buscar en Google, como “avi to mp4” o “mp3 to wav”
    Me tomó más tiempo del que esperaba aceptar una app de línea de comandos, porque el mundo de Windows nos enseñó que todo tiene que tener una GUI

    • Pensaba que la mayoría de esos sitios de conversión de archivos eran básicamente ffmpeg montado sobre algo como nginx
  • La gente dice que ffmpeg es complejo, pero aunque lo conviertas en una GUI bonita, no se vuelve mucho más fácil. Lo complejo es la compresión de video en sí
    A menos que tome decisiones por ti, como una interfaz de clics tipo HandBrake, no creo que ningún software pueda hacerlo más fácil
    No estoy seguro, pero siento que si aprendes con suficiente detalle la codificación y compresión de video digital, también se vuelve bastante intuitivo saber qué hacer en ffmpeg. ¿Alguien lo ha hecho realmente?

    • Hace unos 17 años escribí un filtro DirectShow para Windows Mobile, así que entiendo bastante bien los códecs y los contenedores
      En ese entonces no existían formatos como mkv ni códecs como HEVC, pero el concepto de manipular audio/video mediante varios filtros es excelente, y la mayoría del software de conversión A/V funciona así
      Cuando empecé a ver la página del manual de FFmpeg, vi la conexión, y después de trastear con él alrededor de un día ya pude usarlo
      Puede que me haya ayudado el hecho de que me gusta la línea de comandos y suelo leer las páginas man
  • ffmpeg es potente y lo uso seguido, pero su estructura de API no se me queda en la cabeza. Me gustaría que hubiera un frontend con LLM

  • Es una buena idea. Siempre resulta intimidante hacer que FFmpeg haga exactamente lo que quieres
    ChatGPT sí ayudó, pero no fue perfecto

    • ChatGPT hizo que fuera mucho más fácil usar los argumentos y opciones de muchas herramientas de línea de comandos
      Siempre me costó memorizar las opciones y argumentos de OpenSSL, pero ahora simplemente uso GPT
    • Gracias a ChatGPT, ffmpeg se volvió realmente accesible
      Aun así, las diferencias sutiles entre sistemas operativos siguen siendo un pequeño problema