216.73.217.42
22:06
Thu
04/06/2026
El tiempo - Tutiempo.net

Por Ergaster el 13/06/2020 en
Tutorial

Codificar vídeo con FFmpeg a pelo

https://canariweb.com/storage/upload/images/medium/J8Cd7u11NvyhDI0E0jQbJPP4aHKNnf14JZVrSANJ.jpeg

Vamos a usar libx265 con la que conseguiremos gran compresión

Voy a ir al grano: me parece un desperdicio de recursos hacer unos archivos tan pesados y grandes para tener vídeos cuya calidad no supera en demasía a los DVD y CD Vídeo de hace una década. Hay capítulos de series que pesan cerca de 2GB aunque su duración sea de tan sólo 50 minutos; películas que se pasan de las limitaciones impuestas por el sistema de archivos de FAT32 que está en los 4GB imposibilitando ponerlo en un pendrive o en el disco externo para verlo en la TV. Además, como comprobarán, la calidad de la imagen o el sonido es muy dificil de distinguir. La cuestión es que podemos coger un archivo de vídeo de 1.8GB y dejarlo en la mitad, pero si lo ponemos a 480p, que se ve muy bien en una TV 4k (o al menos igual que el de 1.8GB) podemos llegar a que pese la quinta parte.

Recordar que FFMpeg tiene binarios para varios sistemas operativos, además cuenta con la opción de compilar desde código fuente.

Recodificar a H.265 el vídeo y el bitrate del audio a 160Kbits

ffmpeg -i INPUT_FILE-c:v libx265 -acodec copy -b:a 160k OUTPUT_FILE

Mediante la GPU a H.265 y 44100hz

ffmpeg -i INPUT_FILE -c:v hevc_amf -c:a copy -b:a 160k -ar 44100 OUTPUT_FILE

Si es con una GPU de nVidia usaremos el parámetro de codificación hevc_nvenc.

Otra codificación usando "vbr" (variable bit rate) y "-cq" (constant quality) con la que he conseguido pasar un vídeo de 3 GB a 1 GB manteniendo una muy buena calidad y con una media de velocidad de: speed=43.8x

ffmpeg -i INPUT_FILE -c:v hevc_nvenc -b:v 1500k -rc vbr -cq 24 -c:a aac -b:a 96k VIDEO_OUTPUT.mkv

Escalado de la resolución

ffmpeg -i INPUT_FILE -c:v libx265 -vf scale=480:-1 -acodec copy -b:a 160k video_final.mkv

Nota: algunos codecs darán error porque necesitan ser divisibles por -n, a veces usaremos -2 en vez de -1.

El filtro -vf scale admite dos parámetros, el primero es el ancho, el segundo, el alto. En este caso redimensionamos a 480 píxeles de ancho, si queremos lo podemos poner a 720p o 1080p y codificamos el vídeo con el HEVC 265. Si queremos cambiar el alto, lo haremos así "-vf scale=-1:480p".

Nótese que si nos sale el mensaje: Too many packets buffered for output stream 0:1. debemos usar el parámetro: -max_muxing_queue_size 999

NOTA: este codec exige demasiado a las cpus o gpus, es decir, que tarda muchísimo. Suele dar 1fps en una cpu de 6 núcleos.

Modificar el audio codec o los canales (demuxing)

ffmpeg -i INPUT_FILE -c:v copy -c:a aac -ac 2 -c:a 96K OUTPUT_FILE

La cuestión es que si tenemos subtitulos y varios "steamings" (pistas de audio con diferentes lenguajes, por ejemplo) los perdemos en la codificación. Para evitar esto debemos hacer uso del parámetro -map más un número, siendo 0 (-map 0) todos los streams tal como vemos en el ejemplo inferior.

ffmpeg -i INPUT_FILE  -c:v libx264 -vf scale=-1:480p -c:a aac -b:a 96K -ar 44100 -ac 2 -map 0 OUTPUT_FILE

También podemos seleccionar el stream de vídeo, de audio y los subtítulos, así: -map 0:v:0 (el primer stream de vídeo); -map 0:a:0 (el primer stream de audio); -map 0:s:0 (el primer subtítulo). Todo junto quedaría así:

ffmpeg -i INPUT_FILE -c:v libx264 -vf scale=-1:480p -c:a aac -b:a 96K -ar 44100 -ac 2 -map 0 OUTPUT_FILE

No obstante, si tenemos un archivo con un stream de vídeo el primero de estos (0) y el audio que nos interesa en otro canal de emisión o stream lo haremos así:

ffmpeg -i input.mp4 -c:v hevc_nvenc -b:v 1000k -rc vbr -map 0:v -map 0:a:2 -cq 24 -c:a aac -b:a 192k -ar 44100 -ac 2 output_audio2_video0.mkv

Más información en https://trac.ffmpeg.org/wiki/Map

Limitar la tasa de bits por segundo

ffmpeg -i input -c:v libx264 -b:v 2M -maxrate 2M -bufsize 1M output.mp4

Trocear el vídeo

En ocasiones queremos dividir un vídeo en varias partes ya sea por comodidad, porque necesitamos solo una parte del mismo o --algo que ocurre mucho-- porque el sistema de archivos es FAT32 o similar y nuestro archivo de vídeo pesa más de 4GiB.

ffmpeg -i INPUT_FILE  -t 00:55:00 -c copy part1_OUTPUT_FILE -ss 00:55:00 -c copy part2_OUTPUT_FILE

Por supuesto, también podemos usar "presets" de la siguiente manera: -preset medium | fast | etc. Sabiendo que cuanto más lento mejor calidad de vídeo obtenemos.

  • ultrafast
  • superfast
  • veryfast
  • faster
  • fast
  • medium – default preset
  • slow
  • slower
  • veryslow
  • placebo

También podemos añadir las opciones de calidad "-crf 28" teniendo en cuenta que la escala va de 0 a 51, siendo 0 una compresión sin pérdida alguna; 23, la compresión por defecto; y 51 la mayor compresión y peor calidad

El rango es exponencial, así que se dobla o divide cada vez que añadimos o sumamos 6 de esta manera, -crf 29 tendra el doble de "bitrate" que -crf 23. Más información en: https://trac.ffmpeg.org/wiki/Encode/H.264

Existe también la posibilidad de basarte en el archivo origen utilizando "-tune film | grain | cartoon" etc.

Si quieres ver la información del vídeo usa: ffmpeg -i nombre_video.ext

Si quieres comprobar la integridad del archivo de vídeo, ejecuta: ffmpeg -v error -i nombre_video.ext -f null - >error.log

Iré actualizando este post...

Un enlace interesante: https://egpu.io/forums/pro-applications/easy-video-encoding-benchmark-test-your-gpu-within-seconds/


52%

  Comment Tweeting!

Comments 0
If you would like to have an exclusive webapp made to measure for you, contact us! Contact