User Tools

Site Tools


informatica:linux:edicion_de_video:ffmpeg

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
informatica:linux:edicion_de_video:ffmpeg [2023/10/22 20:45] joseinformatica:linux:edicion_de_video:ffmpeg [2026/06/29 08:15] (current) – [Sacar duración] jose
Line 1: Line 1:
-**Escalar vídeo:**\\+====== Escalar vídeo: ====== 
 +Reducir tamaño vídeo para whatsapp 
 +<code> 
 +ffmpeg -i vermicompostera1.mp4 \ 
 +-vf "scale=240:-2"
 +-vcodec libx264 -crf 28 -preset medium \ 
 +-acodec aac -b:a 128k \ 
 +vermicompostera.mp4 
 +</code> 
 + 
   ffmpeg -i original.mp4 -vf scale=800:600 destino.mp4   ffmpeg -i original.mp4 -vf scale=800:600 destino.mp4
 Si queremos fijar uno y que el otro lo calcule solo:   Si queremos fijar uno y que el otro lo calcule solo:  
Line 8: Line 18:
   ffmpeg -i input.mp4 -vf "select=eq(n\,325)" -vframes 1 output.png   ffmpeg -i input.mp4 -vf "select=eq(n\,325)" -vframes 1 output.png
  
 +Extraer 250 frames de un vídeo
 +<code>
 +#!/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
 +
 +</code>
 +
 +====== 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:
 +<code>
 +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.
 +</code>
 +
 +====== Sacar duración ======
 +Para sacar la duración sumada de los wavs de un directorio
 +<code>
 +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
 +</code>
 +
 +Grabando duraciones individuales en fichero:
 +<code>
 +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
 +</code>
informatica/linux/edicion_de_video/ffmpeg.1698007547.txt.gz · Last modified: by jose