José, miembro de este gran equipo, nos ha hecho el favor de redactar este escrito ya que domina perfectamente dicho tema.
Solución:
Utilizar el silenceremove
filtrar. Esto elimina el silencio solo de la pista de audio: dejará el video sin editar, es decir, las cosas se desincronizarán.
Sus argumentos son un poco crípticos.
Un ejemplo
ffmpeg -i input.mp3 -af silenceremove=1:0:-50dB output.mp3
Esto quita el silencio
- al principio (indicado por el primer argumento
1
) - con longitud mínima cero (indicado por el segundo argumento
0
) - el silencio se clasifica como algo por debajo de -50 decibelios (indicado por
-50dB
).
Documentación: filtro de eliminación de silencio FFMPEG
Además, cualquier persona que busque encontrar el valor correcto para clasificar el silencio puede desear considerar la normalización de su volumen de audio de entrada para 0dB
primero, para hacer esto en ffmpeg, vea esta respuesta.
Editar
Como lo señaló @mems, para detectar si su versión de ffmpeg tiene el filtro ejecutado
ffmpeg -hide_banner -filters | grep silenceremove
si tiene el filtro, generará algo como
silenceremove A->A Remove silence
ffmpeg silent detect solo detecta el silencio. Uno tiene que escanear la salida ffmpeg y cortar el archivo mp3.
En teoría, esto se haría como:
ffmpeg -i INPUT.mp3 -af silencedetect=n=-50dB:d=1
y seguimiento de la salida en forma de:
[silencedetect @ 0000000004970f80] silence_start: -0.00154195
[silencedetect @ 0000000004970f80] silence_end: 3.20435 | silence_duration: 3.2059
...
[silencedetect @ 0000000004970f80] silence_start: 343.84
Y, cortando silencio de principio y fin:
ffmpeg -i INPUT.mp3 -ss 3.20435 -t (343.84-3.20435)
Terminé escribiendo un pequeño programa Java que lo hace. Sugerencias:
- ffmpeg escribe en stderr. Esto significa que necesita usar ProcessBuilder y redirectErrorStream(true).
- en segundo lugar, debe extraer la información de silent_start y silent_end.
- entonces podrías usar las marcas de tiempo para cortar el video
El siguiente código puede ser útil: Uso de Java y FFMPEG con silentdetect para eliminar el silencio de audio
Leí la documentación de eliminación de silencio de FFmpeg y así es como eliminaría el silencio al principio y al final de un archivo de audio (mantiene el silencio en el medio).
ffmpeg -i "INPUT.mp3" -af silenceremove=start_periods=1:stop_periods=1:detection=peak "OUTPUT.mp3"