Agregue 1 segundo de silencio al audio a través de FFmpeg

14

Tengo un archivo de audio AC3 5.1 en el que me gustaría insertar x segundos de audio silencioso al principio. Esto no tiene nada que ver con la muxing de video, por lo que su compensación es inútil ya que parece funcionar solo con una transmisión de audio que acompaña a una de video. Me gustaría lograr esto con ffmpeg. ¿Algunas ideas?

Makaveli84
fuente
¿ffmpeg agregará o unirá el mismo códec a la misma velocidad?
Psycogeek
Supongo ... @Psycogeek
Makaveli84
¿Y es capaz de generar un archivo de audio silencioso con exactamente la misma velocidad de códec y canal? ffmpeg.org/ffmpeg-filters.html#Examples-34 ? Yo mismo uso métodos GUI, pero hacer lo que me pidas debería ser bastante fácil y muy rápido, siempre y cuando los parámetros sean todos iguales. Aquí es donde se muestra agregándolo a un Mov. stackoverflow.com/questions/12368151/… en las respuestas
Psycogeek
Usa Ardor para agregar lo que quieras. Si quieres efectos, así descargar los plugins de la pantorrilla ..
salpicadero

Respuestas:

23

Usando el demuxer concat (agregue silencio al principio y / o final)

Use el demuxer concat si desea evitar volver a codificar el segmento principal. Este método funciona para agregar silencio al principio o al final (o ambos).

  1. Use el filtro de fuente de audio anullsrc para crear el audio silencioso. Deberá hacer coincidir el formato, el diseño del canal y la frecuencia de muestreo del archivo de audio principal. Ejemplo para hacer un canal 5.1, frecuencia de muestreo de 48000 Hz, archivo de audio AC3 silencioso de 1 segundo (ya que este era el formato en la pregunta):

    ffmpeg -f lavfi -i anullsrc=channel_layout=5.1:sample_rate=48000 -t 1 silence.ac3
    
  2. Ahora haga un archivo de texto llamado input.txtque enumere los archivos que se concatenarán:

    file 'silent.ac3'
    file 'main.ac3'
    

    Si desea el silencio al final, simplemente cambie el orden de los archivos input.txt.

  3. Ahora puede concatenar los archivos usando el demuxer concat :

    ffmpeg -f concat -i input.txt -codec copy output.ac3
    

Usando el filtro concat (agregue silencio al principio y / o al final)

Use el filtro concat si desea hacer todo en un comando, o si desea generar un formato diferente al de la entrada (ya que este método se vuelve a codificar de todos modos). Este método funciona para agregar silencio al principio o al final o a ambos.

Ejemplo para agregar 1 segundo de silencio al comienzo de un estéreo, entrada de frecuencia de muestreo de 44100 Hz:

ffmpeg -f lavfi -t 1 -i anullsrc=channel_layout=stereo:sample_rate=44100 -i audio.oga -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1" output.m4a
  • El filtrado resultará en una nueva codificación, mientras que el demuxer concat no lo hará.

  • En anullsrc se recomienda hacer coincidir el diseño del canal y la frecuencia de muestreo de la entrada.

  • Si desea agregar silencio al final en lugar de simplemente cambiar el orden de las entradas dadas al filtro concat: [1:a][0:a]concat=n=2:v=0:a=1.


Usando el filtro adelay (agregue silencio al comienzo)

Use el filtro de audio adelay si desea hacer todo en un comando, o si desea emitir en un formato diferente a la entrada (ya que este método se vuelve a codificar de todos modos). Esto solo funciona para agregar silencio al comienzo de un archivo.

Este ejemplo agregará 1 segundo de silencio al comienzo de una entrada estéreo:

ffmpeg -i input.flac -af "adelay=1000|1000" output.opus
  • El filtrado resultará en una nueva codificación, mientras que el demuxer concat no lo hará.
  • El valor está en milisegundos. Los usuarios de versiones recientes (git master actual o algo más nuevo que FFmpeg 4.1) pueden usar en su lugar 1spor un segundo.
  • Cada canal necesita su propio retraso. Por ejemplo, se usaría una entrada mono adelay=1000, mientras que se usaría una entrada 5.1 adelay=1000|1000|1000|1000|1000|1000.

Usando el filtro apad (agregue silencio al final)

Use el filtro de audio apad si desea hacer todo en un comando, o si desea emitir en un formato diferente a la entrada (ya que este método vuelve a codificar de todos modos). Esto solo funciona para agregar silencio al final de un archivo.

Este ejemplo agregará 1 segundo de silencio al final:

ffmpeg -i input.wav -af "apad=pad_dur=1" output.m4a
  • El filtrado resultará en una nueva codificación, mientras que el demuxer concat no lo hará.

  • La pad_duropción se agregó después del lanzamiento de FFmpeg 4.1, por lo que deberá utilizar una compilación reciente de la rama maestra git o esperar a FFmpeg 4.2.

lema
fuente
55
[Parsed_aevalsrc_0 @ 000000000195fec0] This syntax is deprecated. Use '|' to sep arate the list items.La nueva sintaxis es-i "aevalsrc=0|0|0|0|0|0:d=1"
Steven Penny el
¿Puedo hacer esto para varios archivos a la vez?
Aaron Franke
@AaronFranke Sí, pero ffmpeg no tiene tal característica en sí misma. Tendría que usar su shell o un lenguaje de secuencias de comandos para recorrer el comando. Su sistema operativo es desconocido, así que no puedo darle una solución llave en mano, pero vea ¿Cómo convierte un directorio completo con ffmpeg? para obtener información general (omita la respuesta aceptada, ya que es innecesariamente compleja e ineficiente).
llogan