FFmpeg es un potente programa capaz de editar audio y video desde la línea de comando. Este artículo no pretende más que reunir una solución a aquellas operaciones que se realizan más a menudo.
Crear un script bash con el siguiente contenido en el directorio que contenga los archivos que queremos convertir y ejecutarlo:
for i in *.flac ; do ffmpeg -i "$i" -b:a 192k "$(basename "${i/.flac}")".mp3; sleep 3; done
ffmpeg -i input.eng.ita.mp4 \ -map 0:0 -map 0:1 -map 0:2 \ -c:v copy \ -c:a:0 copy \ -c:a:1 aac \ -metadata:s:a:0 language=eng \ -metadata:s:a:1 language=ita \ output.mp4
ffmpeg -i input.mp4 -map 0:1 -c:a copy output.aac
ffmpeg -i input.mp4 -map 0:a:0 -c:a aac -af "pan=stereo|FL < 1.0*FL + 0.707*FC + 0.707*BL|FR < 1.0*FR + 0.707*FC + 0.707*BR" output-stereo.aac
ffmpeg -i input.mp4 -ss 00:00:10 -map 0:1 -c:a copy output.aac
Muy útil cuando agregamos un flujo de audio a una película que no encaja perfectamente. En este caso se agrega el audio en italiano a partir del segundo 56.850 de input.mp4
ffmpeg -i input.mp4 \ -itsoffset 00:56.850 \ -i italiano.aac \ -map 0:0 \ -map 0:1 \ -map 1:0 \ -codec copy -async 1 \ output.mp4
Los metadato de idioma de un canal de audio puede resultar muy útil cuando por ejemplo el video será cargado dentro Plex. De este modo, se podrá aprovechar el filtro por idioma en la librería de Plex.
-metadata:s:a:0 language=eng -metadata:s:a:1 language=ita
Puede ocurrir que para crear un flujo de audio necesitemos unir dos o más archivos. Lo primero que hay que hacer, es crear un archivo de texto (en este caso lo llamaremos concat.txt) con la ruta de los archivos de audio a unir:
file 'start.m4a' file 'italiano-end.m4a'
Luego, ejecutamos el siguiente comando:
ffmpeg -f concat -i concat.txt -c copy italiano-unido.m4a
ffmpeg -i italiano.m4a -map_metadata -1 -map_chapters -1 -acodec copy italiano-limpio.m4a
Si estamos trabajando con un video que incluye los subtitulos y en medio de una transcodificación no quieren perderse, tendremos que, primero mapearlo.
-map 0:s
y luego, indicar el codec
-scodec mov_text
Si en cambio, se prefiere extraer el subtítulo (subrip) y guardarlo como srt:
ffmpeg -i imput.mkv -map 0:s:0 output.eng.srt
En este caso también cambiamos el codec el audio a AAC y conservamos los streams de subtítulos. Para los que tienen la suerte de tener una gráfica NVIDIA cambiar el codec de video de libx264 a h264_nvenc.
ffmpeg -i "input.mkv" \ -map 0:0 \ -map 0:a \ -map 0:s \ -c:v libx264 -crf 27 -x264-params cabac=1:ref=5:analyse=0x133:me=umh:subme=9:chroma-me=1:deadzone-inter=21:deadzone-intra=11:b-adapt=2:rc-lookahead=60:vbv-maxrate=10000:vbv-bufsize=10000:qpmax=69:bframes=5:b-adapt=2:direct=auto:crf-max=51:weightp=2:merange=24:chroma-qp-offset=-1:sync-lookahead=2:psy-rd=1.00,0.15:trellis=2:min-keyint=23:partitions=all \ -c:a aac \ -c:s mov_text \ -movflags +faststart -threads 0 -movflags use_metadata_tags \ "output.mp4"
Si el flujo de audio del video original es en formato 5.1 tendremos que indicar el número de canales luego de haber especificado el codec
-c:a aac -ac 6 \
Un ejemplo con 3 flujos de audio: el primero mono, el segundo stereo y el tercero 5.1:
-c:a:0 aac -ac:0 1 -c:a:1 aac -ac:1 2 -c:a:2 aac -ac:2 6 \
Para modificar la resolución del flujo de video aplicamos el siguiente filtro:
-vf scale=320:240
El primer valor es el ancho y el segundo el alto. También puede especificarse un valor determinado en uno de ellos y -1 al otro para que sea calculado automáticamente sin modificar la relación de aspecto del original, por ejemplo, para convertir un flujo de video full HD (1080p) en HD (720p):
-vf scale=-1080:-1
ffmpeg -i input_video.mp4 -c:v hevc_nvenc -rc vbr_hq -cq 24 -c:a aac -b:a 192k output_video.mp4