User Tools

Site Tools


informatica:linux:edicion_de_video:ffmpeg

Escalar vídeo:

Reducir tamaño vídeo para whatsapp

ffmpeg -i vermicompostera1.mp4 \
-vf "scale=240:-2" \
-vcodec libx264 -crf 28 -preset medium \
-acodec aac -b:a 128k \
vermicompostera.mp4
ffmpeg -i original.mp4 -vf scale=800:600 destino.mp4

Si queremos fijar uno y que el otro lo calcule solo:

ffmpeg -i original.mp4 -vf scale=800:-1 destino.mp4

Extraer frame

Extrae frame numero 325

ffmpeg -i input.mp4 -vf "select=eq(n\,325)" -vframes 1 output.png

Extraer 250 frames de un vídeo

#!/bin/bash
video=$1
n=`ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 $video`
factor=$(echo "scale=4; $n / 250" | bc)
echo $factor
for ((i=1; i<=249; i++)); do
  frame_decimal=$(echo "$i * $factor" | bc)
  frame=$(echo "$frame_decimal" | cut -d'.' -f1)
  fitxer=`printf "%03d\n" "$i"`
  ffmpeg -i $video -vf "select=eq(n\,${frame})" -vframes 1 jur/${fitxer}.png
done
ffmpeg -i ${video} -vf "select=eq(n\,$((n - 1)))" -vframes 1 jur/250.png

Cortar vídeo

Minuto y segundo de inicio y de fin. Corta del 0:15 al 0:25 total 10 segundos de vídeo

ffmpeg -i original.mp4 -ss 00:00:15 -to 00:25 cortado.mp4

Normalizar audio

Detectar volumen:

ffmpeg -i entrada.wav -af volumedetect -f null -

Salida:

max_volume: -12.3 dB
mean_volume: -28.7 dB

Como el máximo está a -12.3 dB, puedes subir 11.3 dB para dejar 1 dB de margen:

ffmpeg -i entrada.wav -af "volume=11.3dB" salida.wav

CHAGPT:

Normalización automática (la más cómoda)

FFmpeg incorpora el filtro loudnorm.

ffmpeg -i entrada.wav -af loudnorm salida.wav

O indicando una sonoridad concreta:

ffmpeg -i entrada.wav -af loudnorm=I=-16:LRA=11:TP=-1.5 salida.wav
I=-16 → volumen objetivo.
TP=-1.5 → pico máximo.
LRA=11 → rango dinámico.
3. Normalizar dinámicamente (muy recomendable)

Existe el filtro dynaudnorm, que va ajustando el nivel a lo largo del audio.

ffmpeg -i entrada.wav -af dynaudnorm salida.wav

Este suele dar una sensación de mayor volumen sin necesidad de comprimir tanto.

Puedes hacerlo un poco más suave:

ffmpeg -i entrada.wav -af dynaudnorm=f=150:g=15 salida.wav
4. Hacer que la onda "llene" todo el espacio (similar a música comercial)

Una cadena bastante efectiva es:

ffmpeg -i entrada.wav -af "acompressor=threshold=-18dB:ratio=3:attack=20:release=250,dynaudnorm" salida.wav

O incluso añadir un limitador al final:

ffmpeg -i entrada.wav -af "acompressor=threshold=-18dB:ratio=3,dynaudnorm,alimiter=limit=-1dB" salida.wav
¿Cuál te recomiendo?
Solo subir el volumen sin modificar la dinámica: volume (tras medir con volumedetect).
Que se escuche más fuerte y uniforme: dynaudnorm.
Calidad tipo radio/podcast: loudnorm.
Que la forma de onda quede muy "rellena": acompressor + dynaudnorm + alimiter.

Si el audio es una grabación de voz, mi recomendación sería dynaudnorm, ya que suele ofrecer un resultado muy natural sin requerir una configuración compleja.

Sacar duración

Para sacar la duración sumada de los wavs de un directorio

for f in *.wav; do 
    ffmpeg -i "$f" 2>&1 | grep Duration | \
    sed -E 's/.*Duration: ([0-9]+):([0-9]+):([0-9]+\.[0-9]+).*/\1*3600+\2*60+\3/'
done | paste -sd+ - | bc

Grabando duraciones individuales en fichero:

echo "nombre_fichero;duracion" > duraciones.csv

for f in *.wav; do
    dur=$(ffmpeg -i "$f" 2>&1 | grep "Duration" | \
          sed -E 's/.*Duration: ([0-9]+):([0-9]+):([0-9]+\.[0-9]+).*/\1 \2 \3/')

    read h m s <<< "$dur"

    segundos=$(awk "BEGIN {printf \"%.3f\", ($h*3600 + $m*60 + $s)}")

    echo "$f;$segundos" >> duraciones.csv
done
informatica/linux/edicion_de_video/ffmpeg.txt · Last modified: by jose