ffmprovisr: colección de recetas para crear comandos de FFmpeg fácilmente
(amiaopensource.github.io)- 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,ffplayyffprobe - 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+focmd+fpara 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
ffmpegen el símbolo del sistema - Los comandos suelen estar compuestos por pares de flags y valores
- En
-i input_file.ext,-ies el flag que especifica el archivo de entrada, einput_file.extes el archivo objetivo - En
-c:v prores,-c:vespecifica la codificación del stream de video, yproreses el códec que se usará
- En
- 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
ffmpegguarda el video, mientras queffplaypuede 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 5y un archivo de salida, pero el ejemplo de FFplay no requiere-i
- Ejemplo para guardar barras SMPTE:
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,
.mp4puede configurarse de forma predeterminada con codificación H.264
- Por ejemplo,
"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
- Para moverse a la carpeta Downloads en macOS, se usa
"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 copycuando se tenga certeza de que la extensión codificará automáticamente con el códec correcto
- Se puede transcodificar primero a un códec adecuado, o quitar
"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
-nostdinantes de la entrada para sobrescribir el comportamiento predeterminado de interacción con la entrada estándar- Ejemplo:
ffmpeg -nostdin -i input_file ...
- Ejemplo:
- FFmpeg configura automáticamente códecs y valores predeterminados de parámetros de códec según el formato del archivo de salida
.avi: audiomp3, videompeg4.mkv: audioac3, video H.264.mov: audio AAC, video H.264.mp4: audio AAC, video H.264.mpg: audiomp2, videompeg1video.mxf: audiopcm_s16le, videompeg2video.wav: audiopcm_s16le
- Un grafo de filtros es una combinación de nombres de filtros y opciones que viene después de
-vfo-af-vfes un alias de-filter:v- Un ejemplo de filtro de video es
hflip, y un ejemplo de filtro de audio esamerge - 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_complexen 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,dyt -map 0:vselecciona todos los streams de video del primer archivo de entrada-map 0:3selecciona el cuarto stream del primer archivo de entrada-map 0:a:2selecciona 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
- FFmpeg reconoce los tipos de stream
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 0para 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 1y-metadata field_name='Content'- Los campos usados con frecuencia son
description,originator,originator_reference,origination_date,origination_time,coding_historyeIARL - Los campos de metadatos BWF tienen límites de cantidad de caracteres, y
OriginatorReferencetiene un máximo de 32 caracteres
- Los campos usados con frecuencia son
- Al reempaquetar video con códec DV en un archivo
.dv, se usa-f rawvideo -c:v copypara 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
0Proxy,1LT,2Standard y3HQ - FFmpeg admite como contenedores ProRes QuickTime
.mov, Matroska.mkvy MXF.mxf
- Los perfiles ProRes 422 se distinguen como
- Un ejemplo de transcodificación a H.264 es
-c:v libx264 -pix_fmt yuv420p -c:a aac- Los valores predeterminados de
libx264son el presetmediumy CRF 23 -pix_fmt yuv420pespecifica 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”
- Los valores predeterminados de
- La codificación H.264/H.265 basada en GPU Nvidia usa
h264_nvencohevc_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
libx265son el presetmediumy 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
- Los valores predeterminados de
- Un ejemplo sin pérdidas para preservación consiste en colocar FFV1 Version 3 en un contenedor Matroska y generar también el
framemd5de entrada-map 0mapea todos los streams-dnexcluye streams de datos que Matroska no permite-slicecrc 1agrega información CRC para que el decodificador pueda detectar slices dañados-f framemd5 -angenera 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
-anen lugar de-c:a copy
- Un ejemplo para convertir SD a HD usa tres filtros:
colormatrix=bt601:bt709,scale=1440:1080:flags=lanczosypad=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
yadifantes 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
- Si se usa con
- La conversión de espacio de color usa el filtro
colormatrix=src:dst- Los valores permitidos incluyen
bt601,smpte170m,bt470bg,bt709ybt2020 - Para incrustar metadatos de espacio de color se usan
-color_primaries,-color_trcy-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
libx264olibx265, por lo que no se pueden agregar sin recodificar
- Los valores permitidos incluyen
- El cambio de velocidad usa
setptsyatempoen 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
fadeyafade; debido al uso de filtros, hay que recodificar el video y el audio - La extracción de audio usa
-c:a copy -vnpara extraer sin pérdidas el stream de audio sin video - La combinación de dos pistas de audio usa
amergey-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
ffprobeantes 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
concatcon-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
scaleantes 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 60genera segmentos de hasta 60 segundos%03dcrea nombres de archivo con números de 3 dígitos rellenados con ceros
- El recorte sin recodificación usa
-ss,-to,-t,-c copyy-map 0- Los códecs interframe como H.264 pueden comenzar en el punto más cercano basado en un i-frame
-sseof -5es 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-57dBse 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
silenceremovees más adecuado para eliminar silencio al inicio, se invierte el audio y luego se vuelve a invertir
- Como
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,padyformat=yuv420pyadifes un filtro de desentrelazadoscale=1440:1080:flags=lanczosajusta la imagen a 1440x1080pad=1920:1080:(ow-iw)/2:(oh-ih)/2agrega 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=yuv420pespecifica submuestreo de croma 4:2:0 para compatibilidad de reproducción con H.264- Además de
yadif, FFmpeg incluye los desentrelazadoresbwdif,w3fdif,kerndeintynnedi
- 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
idetdetecta el orden de camposbwdifgenera 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=tffosetfield=bff- Como se usa un filtro de video, no se puede usar
-c copyy es necesario recodificar
- Como se usa un filtro de video, no se puede usar
- 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,xey x=(w-text_w)/2:y=(h-text_h)/2la centra independientemente del tamaño del video
- Se especifican las opciones
- 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,boxcoloryratededrawtext- El timecode inicial tiene el formato
hh:mm:ss[:;.]ff
- El timecode inicial tiene el formato
- Para incrustar un archivo de subtítulos se usa
-i subtitles_file -c copy -c:s mov_textmov_textfunciona en contenedores MP4 y MOV- Los formatos permitidos en el contenedor MKV son
ASS,SRTySSA
- 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 globyscale - 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
- El primer comando crea una paleta personalizada con
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
image2es 25 fps %06dlee en orden ascendente nombres de archivo numéricos de seis dígitos
- La tasa de frames predeterminada del demuxer
- Al crear un video combinando una imagen y un archivo de audio, se usan
-loop 1,-shortesty-vf scale=1280:720- Puede ser útil cuando se quiere subir un archivo de audio a plataformas como YouTube
- Con
ffplay -f lavfiy 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=difference128yhstackmuestran lado a lado las diferencias temporales entre dos videos de entradaxstackse 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 envrecord- El ejemplo de OCR usa el filtro
ocrydrawtextpara 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
.shy buclesfor- Ejemplo:
for file in *.mxf; do ffmpeg -i "$file" -map 0 -c copy "${file%.mxf}.mov"; done - El archivo
.shy los archivos.mxfa 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 \;
- Ejemplo:
- En Windows, el procesamiento por lotes se realiza con scripts
.ps1de PowerShell- El ejemplo crea una lista de archivos
.mp4y relapea cada archivo cambiando su extensión a.mkv - Para llamar a
ffmpegsin la ruta completa, debe estar configurado correctamente
- El ejemplo crea una lista de archivos
- 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
-mapy 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
streamhashgenera 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.gzusandoffprobe -f lavfiysignalstats,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
readeia608yffprobe
Archivos de prueba y otros ejemplos de FFmpeg
- Los videos de prueba se crean o reproducen con entradas lavfi como
mandelbrot,smptebars,testsrcysmptehdbars- 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=5ypcm_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 conffmpegy-t 5se 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:0y-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 instaladodvdauthor - El CSV para detección de escenas basada en YDIF muestra los valores
lavfi.signalstats.YDIFdeffprobeysignalstats - 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=movyfilter=crop
- Los ejemplos son
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,cdda2wavycdparanoia -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-Bes 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
- El comando de instalación con Homebrew es
- 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 -Jocdparanoia -Q - Para corregirlo durante la extracción con Cdda2wav, se agrega la bandera
-T
- La verificación de su presencia se realiza con
- 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,montageymogrify - 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
- Los comandos se invocan como comandos individuales, por ejemplo
- La herramienta
flaces 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
--decodeen lugar de--best
1 comentarios
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.
https://ffmpeg.org/donations.html
También creó QEMU, TCC, QuickJS y otros.
Hablando en serio, la cantidad de dispositivos que en cualquier momento dado ejecutan código escrito por él es verdaderamente absurda.
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
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.
Por alguna razón desconocida, ffmpeg se comporta distinto según si las flags
-ssy-t/-tovan antes o después de-i, y en mi caso funcionó mejor ponerlas antes.El texto original tiene el mismo problema.
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.
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.
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.
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
yadifcomo 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.
Si de todos modos vas a recodificar, conviene usar directamente QTGMC.
w3fdif puede producir parpadeo, pero yadif no, así que bwdif se comporta como yadif mientras usa el mejor emparejamiento de campos de w3fdif.
bwdifes un híbrido deyadifyw3fdif.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
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?
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
Siempre me costó memorizar las opciones y argumentos de OpenSSL, pero ahora simplemente uso GPT
Aun así, las diferencias sutiles entre sistemas operativos siguen siendo un pequeño problema