¿Cómo puedo cortar automáticamente todo el silencio (0dB) del mp3 sin volver a codificar?

0

Mientras leo silenceremove volverá a codificar el archivo.

Usualmente lo hago creando archivos manualmente como:

file 'file.mp3'
inpoint 0
outpoint 01:55:00.0

file 'file.mp3'
inpoint 02:03:50.0

y ejecutando este comando:

ffmpeg -f concat -safe 0 -i list.txt -c copy file.mp3

Tal vez pueda usar silencio silenciar para crear el mismo archivo ...

Vitaly Zdanevich
fuente
1
Debido a que el MP3 es un formato comprimido, los silencios se pueden identificar solo mediante descompresión, lo que requiere una recompresión después de la eliminación. Para eliminar silencios sin mayor degradación, deberá editar el archivo original antes de la codificación MP3; Si no está disponible, lo mejor que puedes hacer es descomprimir, eliminar los silencios y guardar con un codificador sin pérdida, pero tendrás una compresión mucho menor en comparación con el MP3.
AFH
Pero con ffmpeg ya podemos cortar partes de mp3 sin tener que volver a codificar las regiones manualmente.
Vitaly Zdanevich
No esperaba eso, pero después de observar la especificación de MP3, parece que cada bloque de datos puede comprimirse de forma independiente. Debería poder crear una lista de edición desde silencedetect, pero probablemente vale la pena revisar si puedes agregar -c copy al silenceremove cadena de comando Desafortunadamente no tengo estas opciones en mi copia de ffmpeg (3.4.4), así que no puedo probar si funciona.
AFH
@AFH De otra respuesta : You cannot use -acodec copy to keep the original quality.
Vitaly Zdanevich
He mirado la respuesta y los enlaces de @ harrymc: encontré que hacer tener silenceremove Como filtro, pero cuando intenté combinarlo con -c copy tengo Filtergraph 'silenceremove=0.5:-50dB' was defined for audio output stream 0:0 but codec copy was selected. / Filtering and streamcopy cannot be used together. Así que creo que esa debe ser su respuesta, aunque una lista de edición puede permitir una respuesta sin tener que volver a codificar.
AFH

Respuestas:

0

Esto se responde en el post de desbordamiento de pila usando FFMPEG con silenciar para detectar silencio de audio .

El primer comentario es que silencedetect solo detecta el silencio, no lo elimina. Debes utilizar en su lugar el filtro silenciar eliminar.

Para detectar si su versión de ffmpeg tiene este filtro ejecutado:

ffmpeg -hide_banner -filters | grep silenceremove

La salida debe verse como:

silenceremove A->A Remove silence

El comando para eliminar partes silenciosas puede verse como:

ffmpeg -i input.mp3 -af silenceremove=1:0:-50dB output.mp3

Donde el parámetro silenceremove se explica como eliminar:

  • al principio (indicado por el primer argumento 1 )
  • con longitud mínima cero (indicado por el segundo argumento 0 )
  • el silencio se clasifica como cualquier cosa bajo -50 decibelios (indicado por -50dB )

Referencia: FFMPEG silencio eliminar filtro .

Para encontrar el valor correcto para el silencio, normalice primero el volumen de audio de entrada a 0dB, descrito en esta respuesta .

harrymc
fuente
Comenta bajo tu primer enlace: Please note, that -af silenceremove **will re-encode** your audio files.
Vitaly Zdanevich
Esto sería realmente necesario, ya que el esquema de codificación puede necesitar volver a codificar el audio inmediatamente antes o después de la parte silenciosa de recorte.
harrymc
Pero con ffmpeg podemos cortar manualmente partes del mp3 sin tener que volver a codificar.
Vitaly Zdanevich
No tengo conocimiento de cómo se programó este filtro.
harrymc
1
El filtrado de @VitalyZdanevich requiere recodificación. La entrada es descodificado, alimentado al filtro, luego codificado a su formato de salida. Entonces no puedes copia de flujo al filtrar. "Cortar manualmente partes del mp3" con la copia de secuencia omite la decodificación / codificación y solo vuelve a hacer muxes.
llogan