informatica:linux:edicion_de_video:ffmpeg
Table of Contents
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
