FFmpeg - Concenar archivos de audio con espaciado

2

Por favor mira la imagen:

ingrese la descripción de la imagen aquí

Cada clip de audio tiene el mismo códec / sample_rate, pero tiene una duración diferente y cada espacio también es diferente. Siempre hay espacio entre clips, sin superposición. Por lo tanto, no hay razón para volver a codificar , ya que esto es básicamente un trabajo de copia de flujo. Es importante porque debo preservar la calidad original de cada clip.

Ahora, pensemos que encontré lo que buscaba. Le di a este comando un pseudo nombre "-start_at" , inserta el clip en la secuencia de audio en un momento dado. Con este pseudo comando, estableceré el tiempo en que cada clip debe comenzar. Y el resto del trabajo debe hacerse mediante ffmpeg command / filter / script, etc.

ffmpeg -start_at 00.00 -i audio1.opus  -start_at 06.30 -i audio2.opus  -start_at 21.15 -i audio3.opus  -start_at 26.35 -i audio4.opus

Solo piense que ffmpeg llenará los huecos con sonidos silenciosos automáticamente.

Entonces, ¿hay un comando / filtro ffmpeg para esto? ¿O una gui / script ffmpeg, etc.?

dandidondi
fuente
¿Podría hacer un archivo de audio silencioso de 5 segundos y simplemente concatenar usando el archivo en blanco como espaciador?
HSchmale

Respuestas:

4

FFmpeg es capaz de manejar esto. Lo que necesita usar es filter_complexcon encadenamiento de filtro. Puede crear un audio silencioso con aevalsrc. Para crear un audio silencioso de 5 segundos,

aevalsrc=0:d=5

Entonces el siguiente comando funcionará para usted.

ffmpeg -i input_audio_1 -i input_audio_2 -i input_audio_3 -filter_complex "
aevalsrc=0:d=10[s1];
aevalsrc=0:d=15[s2];
aevalsrc=0:d=20[s3];
[s2][1:a]concat=n=2:v=0:a=1[ac1];
[s3][2:a]concat=n=2:v=0:a=1[ac2];
[0:a][s1][ac1][ac2]amix=inputs=4[aout]" -map [aout] output_audio

Aquí asumí que cada audio tiene una duración de 5 segundos y la re-codificación es opcional como,

-c:a libmp3lame -ac 2 -b:a 128k

Como la amixsuperposición de audios he agregado un audio silencioso a cada uno de los audios de entrada. También puede probar amergey adelaydonde el documento en sí tiene una explicación clara.

¡Espero que esto te ayude!

Chamath
fuente
Lamentablemente, no hay espacios fijos ni duraciones fijas para los clips. Además, no quiero volver a codificar, incluso si no afecta mucho la calidad. Actualicé mi primera publicación, mira la foto.
dandidondi
Edité mi respuesta. Posiblemente puede omitir la nueva codificación. Y también puede ajustar las duraciones de acuerdo con sus entradas. Esto no requiere duraciones iguales. Aún así necesita calcular las duraciones y alimentarlas al comando en consecuencia. Puedes usar ffprobepara calcular las duraciones.
Chamath
pero el amixfiltro todavía vuelve a codificar.
dandidondi
2
FYI: Re-codificar es un mal necesario cuando se intenta procesar el contenido fuente a través de filtros. -c copylos intentos deberían dar lugar a Streamcopy requested for output stream 0:0, which is fed from a complex filtergraph. Filtering and streamcopy cannot be used together.mensajes. Para preservar la calidad del audio de origen, envíe su audio a un códec sin pérdidas y luego -map [aout] -c:a pcm_s16le -ac 2 -ar 44100 - | ffmpeg -i - -c:a libmp3lame -b:a 320k ConcatenatedAudio.mp3
Mr. What
1

Aquí está el ejemplo de audio concat:

ffmpeg -y -f s16be -i /dev/zero -af "[in]anullsink;amovie=1.wav[a1];amovie=silence.wav[a2];amovie=2.wav[a3];amovie=4.wav[a4];[a1][a2][a3][a4]concat=n=4:v=0:a=1[out]" -shortest -t 12 output.wav

Observe algunas cosas que necesita saber aquí:

  1. Comencé con una entrada limpia /dev/zero, es agradable, sin embargo, ¿puede haber una mejor manera de hacerlo?
  2. Necesita saber la duración total del clip antes de hacerlo ( t=12)
  3. Prefabricado el silence.wavarchivo. Puedes usar filtros como anullsrc(ver nb_samplesen la documentación ) u otros, pero esto es bastante penoso si me preguntas.
  4. A veces, al usar este enfoque, FFmpeg no sabe cuándo detenerse y, sin embargo, no creará una pista de silencio vacía ya que -shortestse aplica el parámetro.
P.EJ
fuente