audio ffmpeg mix

audio - Problema de volumen del filtro amix FFMPEG con entradas de diferente duración



(8)

Noté que el filtro ffmpeg amix no genera un buen resultado en una situación específica. Funciona bien si los archivos de entrada tienen la misma duración. En ese caso, el volumen se cae en un valor constante y se puede arreglar con ",volume=2" .

En mi caso estoy usando archivos con diferente duración. El volumen resultante no es bueno. El primer flujo mixto resultó en el volumen más bajo, y el último es el más alto. Puede ver en la imagen que el volumen aumenta linealmente dentro de un tiempo.

Mi comando:

ffmpeg -i temp_0.mp4 -i user_2123_10.mp4 -i user_2123_3.mp4 -i user_2123_4.mp4 -i user_2123_7.mp4 -i user_2123_5.mp4 -i user_2123_1.mp4 -i user_2123_8.mp4 -i user_2123_0.mp4 -i user_2123_6.mp4 -i user_2123_9.mp4 -i user_2123_2.mp4 -i user_2123_11.mp4 -filter_complex "[1:a]adelay=34741.0[aud1]; [2:a]adelay=18241.0[aud2];[3:a]adelay=20602.0[aud3]; [4:a]adelay=27852.0[aud4];[5:a]adelay=22941.0[aud5]; [6:a]adelay=13142.0[aud6];[7:a]adelay=29810.0[aud7]; [8:a]adelay=12.0[aud8];[9:a]adelay=25692.0[aud9]; [10:a]adelay=32143.002[aud10];[11:a]adelay=16101.0[aud11]; [12:a]adelay=40848.0[aud12]; [0:a][aud1][aud2][aud3][aud4][aud5][aud6][aud7] [aud8][aud9][aud10][aud11] [aud12]amix=inputs=13:duration=first:dropout_transition=0" -vcodec copy -y temp_1.mp4

Eso podría solucionarse aplicando silencio al principio y al final de cada clip, entonces tendrán la misma duración y el volumen estará en el mismo nivel.

Sugiera cómo puedo usar amix para mezclar muchas entradas y garantizar un nivel de volumen constante.


¡Tengo el mismo problema pero encontré una solución!

Primero el problema: tuve que mezclar un archivo de música de fondo con 3 piezas de voz TTS diferentes que comienzan con diferentes retrasos. Al final, el sonido de fondo era extremadamente fuerte.

Intenté la respuesta sugerida pero no funcionó para mí, el volumen final aún era mucho mayor. Así que mis pensamientos fueron: "Todas las entradas deben tener la misma longitud, por lo que cada vez que la misma cantidad de audio está activa en la mezcla"

Apad en todas las entradas TTS con el conjunto completo_len y la opción -shortest en combinación hizo el trabajo por mí.

Llamada de ejemplo:

ffmpeg -y -nostats -hide_banner -v quiet -hwaccel auto -f image2pipe -i pipe:0 -i bgAudio.aac -i TTS1.mp3 -i TTS2.mp3 -i TTS3.mp3 -filter_complex [1:a]loudnorm=I=-16:TP=-1.5:LRA=11:linear=false[a0];[2:a]loudnorm=I=-16:TP=-1.5:LRA=11:linear=false:dual_mono=true,adelay=7680|7680,apad=whole_len=2346240[a1];[3:a]loudnorm=I=-16:TP=-1.5:LRA=11:linear=false:dual_mono=true,adelay=14640|14640,apad=whole_len=2346240[a2];[4:a]loudnorm=I=-16:TP=-1.5:LRA=11:linear=false:dual_mono=true,adelay=3240|3240,apad=whole_len=2346240[a3];[a0][a1][a2][a3]amix=inputs=4:dropout_transition=0,asplit=6[audio0][audio1][audio2][audio3][audio4][audio5];[0:v]format=yuv420p,split=6[1080p][720p][480p][360p][240p][144p] -map [audio0] -map [1080p] -s 1920x1080 -shortest out1080p.mp4 -map [audio1] -map [720p] -s 1280x720 -shortest out720p.mp4 -map [audio2] -map [480p] -s 858x480 -shortest out480p.mp4 -map [audio3] -map [360p] -s 640x360 -shortest out360p.mp4 -map [audio4] -map [240p] -s 426x240 -shortest out240p.mp4 -map [audio5] -map [144p] -s 256x144 -shortest out144p.mp4

¡Espero que alguien ayude a esto!


Intenta usar la multiplicación:

"amix=inputs="+ chunks.length + ":duration=first:dropout_transition=3,volume=" + chunks.length


La solución parece ser una combinación de "preamplificador" o multiplicación, como lo expresa Maxim, Y tiene que establecer dropout_transition >= max delay + max input length (o un número muy alto):

amix=inputs=13:dropout_transition=1000,volume=13

Notas:

  • amix tiene que volver a muestrear flotante de todos modos, por lo que no hay inconveniente en agregar el filtro de volume (que, por defecto, también muestra flotante).
    Y como estamos usando flotadores, no hay recorte y (casi) no hay pérdida de precisión.
  • No voy a @Mulvya para el análisis, pero su solución es frustrantemente no matemática
  • Originalmente estaba tratando de hacer esto con sox , que era demasiado lento. El filtro remix de Sox tiene el modificador -m que deshabilita el ajuste 1/n .
  • Mientras más rápido, ffmpeg parece estar usando mucha más memoria para la misma tarea. YMMV: no probé esto a fondo, porque finalmente me decidí por un pequeño script de Python que usa la función de overlay pydub , y solo mantiene el archivo de salida final y un segmento en la memoria (mientras que ffmpeg y sox parecen mantener todo el segmentos en la memoria).

Lo sentimos, por no enviar la salida ffmpeg.

Después de todo, terminamos escribiendo pequeñas utilidades en C ++ para mezclar audio. Pero primero convertimos mp4 a formato sin formato (pcm). Eso funcionó bien para nosotros, incluso requiere espacio adicional en el disco duro para archivos intermedios sin procesar.

El código se ve así:

short addSounds(short a, short b) { double da = a; da /= 65536.0; da += 0.5; double db = b; db /= 65536.0; db += 0.5; double z = 0; if (da < 0.5 && db < 0.5) { z = 2 * da*db; } else { z = 2 * ( da + db ) - 2 * da* db - 1; } z -= 0.5; z *= 65536.0; return (short)z; }


Te mostraré mi código.

"amix="+inputs.size()+",volume="+(inputs.size()+1)/2+"[mixout]/""

No uso el código dropout_transition=0 porque causará el problema que se encuentra.

pero también encuentro el problema de que el volumen será menor a medida que aumente el tamaño de las entradas.

entonces hago el volumen más alto.


intente cambiar la transición de abandono a la duración de la primera entrada:

duration=first:dropout_transition=_duration_of_the_first_input_in_seconds_

Aquí está mi comando ffmpeg:

ffmpeg -y -i long.wav -i short.wav -filter_complex "[1:a]adelay=6000|6000[a1];[1:a]adelay=10000|10000[a2];[1:a]adelay=14000|14000[a3];[1:a]adelay=18000|18000[a4];[1:a]adelay=21000|21000[a5];[1:a]adelay=25500|25500[a6];[0:a][a1][a2][a3][a4][a5][a6]amix=inputs=7:duration=first:dropout_transition=32[aout]" -map "[aout]" -ac 2 -b:a 192k -ar 44100 output.mp3

ver dos transiciones de abandono como captura de pantalla


amix escala el volumen de cada entrada en 1/n donde n = no. de entradas activas. Esto se evalúa para cada cuadro de audio. Entonces, cuando una entrada cae, el volumen de las entradas restantes se escala en una cantidad menor, por lo tanto, sus volúmenes aumentan.

Cambiar el dropout_transition para todas las entradas anteriores, como se sugiere en otras respuestas, es un enfoque, pero creo que dará como resultado modulaciones de volumen grueso. El mejor método es normalizar el audio después del amix.

En la actualidad, tiene dos opciones, el loudnorm o el filtro dynaudnorm . Este último es mucho más rápido

La sintaxis es agregarlo después del amix, entonces

[aud11][aud12]amix=inputs=13:duration=first:dropout_transition=0,dynaudnorm"

Lea la documentación, si desea ajustar los parámetros para el volumen máximo o la normalización del modo RMS ... etc.


La solución que he encontrado es especificar el volumen de cada pista en un orden "descendiente" y no usar ningún filtro de normalización después.

Utilizo este ejemplo, donde concaté el mismo archivo de audio en diferentes posiciones:

ffmpeg -vn -i test.mp3 -i test.mp3 -i test.mp3 -filter_complex "[0]adelay=0|0,volume=3[a];[1]adelay=2000|2000,volume=2[b];[2]adelay=4000|4000,volume=1[c];[a][b][c]amix=inputs=3:dropout_transition=0" -q:a 1 -acodec libmp3lame -y amix-volume.mp3

Más detalles, ver esta imagen. La primera pista es la mezcla normal, la segunda es la que tiene los volúmenes especificados; El tercero es la pista original. Como podemos ver, la segunda pista parece tener un volumen normal.

ffmpeg -vn -i test.mp3 -i test.mp3 -i test.mp3 -filter_complex "[0]adelay=0|0[a];[1]adelay=2000|2000[b];[2]adelay=4000|4000[c];[a][b][c]amix=inputs=3:dropout_transition=0" -q:a 1 -acodec libmp3lame -y amix-no-volume.mp3 ffmpeg -vn -i test.mp3 -i test.mp3 -i test.mp3 -filter_complex "[0]adelay=0|0,volume=3[a];[1]adelay=2000|2000,volume=2[b];[2]adelay=4000|4000,volume=1[c];[a][b][c]amix=inputs=3:dropout_transition=0" -q:a 1 -acodec libmp3lame -y amix-volume.mp3

Realmente no puedo entender por qué amix cambia el volumen; de todas formas; Estuve buscando un buen tiempo para encontrar una buena solución.