Mezcle adecuadamente 5.1 a estéreo usando ffmpeg

27

Tengo una pista de audio 5.1 de una película donde el frente izquierdo y el derecho delantero contienen música, y el centro contiene diálogo. Reproducir la pista 5.1 en VLC combina todo muy bien.

Estoy tratando de convertir la pista 5.1 a estéreo usando ffmpeg -ac 2, sin embargo, la mezcla estéreo resultante tiene un volumen mucho más débil que reproducir la pista 5.1 de forma nativa.

Agregar agrega -af "pan=stereo|c0=FL|c1=FR"el volumen correcto, pero luego no hay diálogo porque el canal central no está incluido.

Entonces, ¿la solución es tal vez mezclar izquierda / centro / derecha en estéreo y tirar los canales del subwoofer de fondo? (Supongo que aquí ...)

Entonces la pregunta es: ¿cómo hago para que ffmpeg downmix 5.1 esté en estéreo de la misma manera que lo hace VLC, con el mismo volumen fuerte en el resultado final?

outrin
fuente
¿Estás seguro de que VLC está reproduciendo canales adicionales? La mezcla descendente puede provocar la normalización, de modo que la suma de cada entrada por canal de salida no provoque una sobrecarga, por lo que se evita el recorte. Esto puede hacer que suene más silencioso.
llogan
Lo básico: mi archivo es 5.1. Mis parlantes son estéreo. No sé qué hace VLC, pero crea un excelente resultado final en mis altavoces estéreo a partir de los datos de la fuente 5.1 (volumen fuerte, música y diálogo incluidos). ffmpeg, por otro lado, crea un resultado de "bajo volumen" cuando se usa -ac 2. Entonces, estoy preguntando cómo hacer que ffmpeg genere el mismo buen resultado que VLC.
2014

Respuestas:

29

Encontré la respuesta que Shane proporcionó para proporcionar muy poco de los otros canales y demasiado del centro. Las películas con auriculares sonaban fuera de balance, con todos los diálogos y sin suficiente música de fondo / efectos.

De acuerdo con los estándares ATSC (sección 7.8, página 91), la siguiente fórmula se usa para mezclar 5.1 a estéreo convencional (en oposición a la matriz):

Lo = 1.0 * L + clev * C + slev * Ls ;
Ro = 1.0 * R + clev * C + slev * Rs ;

clev y slev deben ser .707, de acuerdo con las tablas 5.9 y 5.10 en el documento mencionado anteriormente, suponiendo un nivel de mezcla de centro / surround de 0. Se proporcionan otros valores en esas tablas que reducen la cantidad de mezcla central, que no encuentro útil.

Con esto en mente, la siguiente opción ffmpeg produce un buen sonido equilibrado con diálogo audible. Tenga en cuenta que no es necesario especificar los canales de audio.

-af "pan=stereo|FL < 1.0*FL + 0.707*FC + 0.707*BL|FR < 1.0*FR + 0.707*FC + 0.707*BR"

Una nota sobre el uso del símbolo menor que, de la documentación del filtro de desplazamiento :

Si el '=' en una especificación de canal se reemplaza por '<', entonces las ganancias para esa especificación se volverán a normalizar de modo que el total sea 1, evitando así el ruido de recorte.

Gregory
fuente
55
Los estándares ATSC que ha vinculado aquí se vincularon desde el wiki de FFmpeg sobre el tema , por lo que no es sorprendente que la fórmula utilizada aquí sea la misma implementada por FFmpeg con su ac -2interruptor. En otras palabras, la única diferencia entre usar este filtro y hacer ac -2es escribir mucho más.
Hashim
@Hashim No solo escribe. Una respuesta con una explicación detallada de los fundamentos es objetivamente mejor que "escriba esto para obtener eso".
Sevastyan Savanyuk
18

Desde entonces, las respuestas a esta pregunta se han vuelto un poco confusas, y muchas contienen información redundante y otras inexactitudes completas. Esta respuesta es un intento de racionalizar la información en estas respuestas mientras elimina los problemas en ellas.

Lo más importante, vale la pena tener en cuenta que la respuesta de Gregory, actualmente la respuesta más votada a esta pregunta, no es diferente a usar el -ac 2interruptor, más sobre esto a continuación.

Mezclar una transmisión de audio de 5.1 canales a estéreo con -ac 2

FFmpeg viene con capacidades incorporadas para mezclar una pista 5.1 a estéreo, y esta es también la solución que la propia documentación de FFmpeg recomienda :

Nota: ffmpeg integra un sistema predeterminado de mezcla descendente (y mezcla ascendente) que se debe preferir (la -acopción) sobre el filtro panorámico a menos que tenga necesidades muy específicas.

El -ac 2conmutador funciona mezclando proporciones de los primeros 5 canales de la transmisión de 6 canales de la fuente: Atrás izquierda, Atrás derecha, Delantera izquierda, Delantera derecha y Delantera central, en los canales Frontal izquierdo y Frontal derecho de la transmisión estéreo de salida:

ingrese la descripción de la imagen aquí

Al hacerlo, el audio del canal LFE (el .1 en 5.1, reservado para el subwoofer y utilizado para efectos profundos de baja frecuencia) se descarta por completo cuando se utiliza esta opción.

Desafortunadamente, en mis pruebas -ac 2resultó en niveles generales de música y diálogo que fueron los más diferentes a la fuente, lo que la convierte en la fórmula de downmix que da el peor resultado de todas las fórmulas que probé, aunque puede probarlo y descubrir que le ofrece una mezcla descendente perfectamente adecuada para sus necesidades, en cuyo caso utilizar cualquier otra fórmula sería excesivo para usted.


Para mezclar una pista DTS -ac 2 sin transcodificarla (es decir, mantener su códec y extensión igual):

ffmpeg -i "sourcetrack.dts" -c:a dca -ac 2 "stereotrack.dts"

Como señaló Mephisto en su respuesta, si el diálogo y la música suenan bien equilibrados entre ustedes pero simplemente carecen de volumen, puede mezclar la transmisión al mismo tiempo que aumenta su volumen:

ffmpeg -i "sourcetrack.dts" -c:a dca -ac 2 -vol 425 "stereotrack.dts"

Para el -volconmutador, el volumen del 100% en la fuente es equivalente al valor entero 256, y el uso de un valor mayor que este aumentará el volumen general de la transmisión de audio. Sin embargo, tenga en cuenta que hacerlo demasiado puede provocar distorsiones o artefactos, especialmente durante sus secciones más fuertes.

Para mezclar una transmisión de audio a estéreo y transcodificarla al códec AC3, por ejemplo:

ffmpeg -i "sourcetrack.dts" -c:a ac3 -ac 2 "stereotrack.ac3"

Mezclar una transmisión de audio de 5.1 canales a estéreo con un algoritmo de mezcla personalizado

Si desea una mezcla de baja calidad más alta, o debe incluir absolutamente la transmisión LFE en su salida, puede usar el interruptor del filtro de audio de FFmpeg ( -af) para mezclar el audio usando una fórmula de mezcla personalizada.

Downmixing con la fórmula ATSC (respuesta de Gregory)

En el momento de publicar esta respuesta, la respuesta más votada a esta pregunta fue la de Gregory , que coloca la fórmula de la especificación ATSC (consulte la sección 7.8.2, Mezcla descendente en dos canales ) en un filtro de audio FFmpeg. Esta especificación está directamente vinculada a la documentación de FFmpeg sobre el tema , lo que indica que es muy probable que sea la misma fórmula que FFmpeg ya implementa para su -ac 2conmutador. Si esto es cierto, escribir la fórmula completa en la respuesta de Gregory no sería diferente a usar el -ac 2interruptor y, por lo tanto, una pérdida de tiempo.

Decidí probar esto con certeza volviendo a codificar el mismo audio de entrada usando ambos -ac 2y el -affiltro de la respuesta de Gregory (los comandos exactos utilizados se pueden ver en las notas al pie de esta respuesta).

Luego comparé los tamaños de los archivos de salida resultantes y descubrí que eran, byte por byte, del mismo tamaño:

ingrese la descripción de la imagen aquí

Finalmente, abrí los dos archivos de salida en Audacity, y comparé sus formas de onda para confirmar que eran idénticos (haga clic para ampliar):

ingrese la descripción de la imagen aquí

Por lo tanto, parece bastante concluyente que la fórmula ATSC detallada en la respuesta de Gregory es la misma ya implementada por FFmpeg , y que su uso es completamente redundante cuando no hace nada que -ac 2no lo hace, y es un comando mucho más engorroso.

Downmixing sin descartar el canal LFE (respuesta de Dave_750)

De las varias incluidas en las respuestas, esta es la única de las fórmulas de downmix que parece mezclar el canal LFE en el estéreo de salida en lugar de descartarlo por completo, y como resultado, la que garantiza el menor sonido de la fuente es perdido.

El nivel de volumen general es más alto y más completo que hacerlo -ac 2, pero también es más bajo que la mezcla de abajo del Diálogo Nightmode. Sin embargo, los niveles de música están mucho más cerca de la fuente que el downmix de Nightmode Dialogue, y debido a la inclusión de la pista LFE, aumentar el volumen de la salida al usar esta fórmula de downmix puede crear un flujo de salida que suena más fiel a la fuente 5.1 que todos los demás. Fórmulas que probé.

Si tiene la capacidad, le recomiendo codificar su (s) secuencia (s) de audio utilizando esta fórmula de mezcla descendente y la mezcla descendente de Diálogo de modo nocturno, y comparando cuidadosamente las formas de onda de los dos para determinar cuál es mejor.

Para mezclar una pista 5.1 a estéreo con esta fórmula y aumentar su nivel de volumen a 425 (donde 256 es el 100% del nivel de volumen de la fuente original):

ffmpeg -i "sourcetrack.dts" -c dca -vol 425 -af "pan=stereo|FL=0.5*FC+0.707*FL+0.707*BL+0.5*LFE|FR=0.5*FC+0.707*FR+0.707*BR+0.5*LFE" "outputstereo.dts"

Downmixing con el Diálogo Nightmode de Robert Collier (respuesta de Shane Harrelson)

La fórmula del Diálogo Nightmode, creada por Robert Collier en el foro Doom9 y obtenida por Shane Harrelson en su respuesta, da como resultado una mezcla mucho mejor que el -ac 2cambio, en lugar de diálogos demasiado silenciosos, los lleva a niveles mucho más cercanos al fuente.

De la descripción de Robert Collier de la mezcla:

Después de convertir muchas pistas de películas DTS de 5.1 a 2.0 usando eac3to, he encontrado que las asignaciones de canales predeterminadas de eac3to dan como resultado diálogos muy tranquilos y música y escenas de acción demasiado ruidosas. Aunque los coeficientes de mezcla descendente del canal eac3to tienen una base científica, a menudo no suenan bien en la práctica debido al bajo volumen de diálogo. Este ajuste preestablecido es para aquellos que buscan diálogos claros con la música del canal izquierdo y derecho aún siendo audible pero más en segundo plano.

Como puede ver, el centro frontal (diálogos) entra correctamente ahora y permanece en el nivel original, mientras que la música y las explosiones siguen siendo un efecto de fondo y no lo dominan. Este preajuste resuelve el problema de que tenga que tocar constantemente la perilla de volumen cuando mira películas DTS 5.1 convertidas a 2.0 para escuchar diálogos. (Especialmente para ver películas en la noche en las que no quieres despertar a otros pero aún quieres poder escuchar diálogos).

Desafortunadamente, la música de esta fórmula de downmix es mucho más baja que en la fuente 5.1 (que probablemente fue por diseño considerando la intención de Collier de crear una mezcla de "modo nocturno") y debido a la pérdida completa de la pista LFE, el audio de salida general no suena tan completo o cercano a la fuente como la fórmula de Dave_750 con volumen aumentado .

Sin embargo, si por alguna razón desea evitar aumentar el volumen general de la transmisión, entonces el Diálogo Nightmode probablemente sea su mejor opción, aunque, una vez más, le recomiendo codificar su transmisión de audio a ambos y comparar cuidadosamente las formas de onda de los dos. .

Para mezclar con la fórmula del diálogo Nightmode en FFmpeg:

ffmpeg -i "sourcetrack.dts" -c dca -af "pan=stereo|FL=FC+0.30*FL+0.30*BL|FR=FC+0.30*FR+0.30*BR" "stereotrack.dts" 

La respuesta de Tarc

Esta respuesta simplemente pone la fórmula de downmix Diálogo de modo nocturno de la respuesta de Shane Harrelson en un comando para convertir la secuencia de audio en un contenedor MKV. Si bien el comando dado en esta respuesta funcionaría bien en una transmisión de audio de este tipo, adaptarlo para una pista de audio independiente daría el error:

El filtrado y la streamcopy no se pueden usar juntos

Esto se debe a que el códec de audio no se puede copiar al mezclar hacia abajo, como todos los demás cambios que FFmpeg realiza en una secuencia de salida, una mezcla hacia abajo requiere que la pista se vuelva a codificar para que se apliquen los cambios.

Este comando también incluía un -ac 2interruptor redundante que FFmpeg habría ignorado.


Comandos de prueba

Para demostrar la fiabilidad de las pruebas que realicé para esta respuesta, a continuación se detallan todos los comandos que utilicé para probar cada fórmula de downmix.

El comando de prueba utilizado para la -ac 2opción:

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -ac 2 "Audio 1 (-ac 2).wav"

El comando de prueba utilizado para la respuesta de Gregory:

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -af "pan=stereo|FL < 1.0*FL + 0.707*FC + 0.707*BL|FR < 1.0*FR + 0.707*FC + 0.707*BR" "Audio 2 (ATSC Algorithm Downmix).wav"

El comando de prueba utilizado para la respuesta de Dave_750:

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -vol 425 -af "pan=stereo|FL=0.5*FC+0.707*FL+0.707*BL+0.5*LFE|FR=0.5*FC+0.707*FR+0.707*BR+0.5*LFE" "Audio 4 (Dave750 Downmix).wav"

El comando de prueba utilizado para la respuesta de Shane Harrelson:

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -af "pan=stereo|FL=FC+0.30*FL+0.30*BL|FR=FC+0.30*FR+0.30*BR" "Audio 3 (Nightmode Dialogue Downmix).wav"
Hashim
fuente
1
Una visión impresionante! Gracias por tomarse el tiempo para compartir esto. Extraño entonces, eso -ac 2me dio un resultado inferior para empezar, lo que provocó la publicación original. Intentaré esto nuevamente y, si es posible, comparta un extracto 5.1 que no dé un resultado satisfactorio con la mezcla descendente incorporada. ¡También es muy bueno saber que puede mezclar sin transcodificar!
outrin
@forthrin Tenga en cuenta que la codificación y la transcodificación son dos cosas diferentes. La transcodificación convierte de un códec / extensión a otro, y la codificación convierte al mismo códec / extensión. Puede mezclar y aplicar otros efectos FFmpeg a una secuencia sin transcodificación, pero no sin codificación. La ac -2opción también me dio el resultado más inferior de todas las fórmulas de downmix, creo que esto es solo un fallo de la fórmula del estándar ATSC.
Hashim
Intenté esto ahora. Parece que ffmpeg -i 5.1.mp4 -ac 2 2.mp4funciona, pero ffplay -i 5.1.mp4 -ac 2no.
outrin
9

Prueba este downmix:

-ac 2 -af "pan=stereo|FL=FC+0.30*FL+0.30*BL|FR=FC+0.30*FR+0.30*BR" 

como lo sugirió Robert Collier en el foro Doom9.

Shane Harrelson
fuente
2
¿Qué significan todas esas opciones? Si los explica, las personas podrán usar su respuesta para resolver diferentes problemas en lugar de simplemente copiar y pegar.
David Richerby
2
@DavidRicherby -ac = Canales de audio (2 para estéreo), -af = Filtro de audio
Cestarian
3
Intenté esto para una película 5.1 y al menos el estéreo de salida me pareció completamente bien. Diálogo claro y nada más parecía faltar. Sería genial si alguien con conocimiento de VLC pudiera compartir exactamente lo que se hace en el downmix predeterminado de 5.1 a 2.0 allí.
2016
2
@DavidRicherby: Las opciones dentro del filtro de audio (-af) son: FL = Delantero izquierdo; BL = Atrás-izquierda; FC = Frente-centro; FR = Delantero-derecho; BR = Atrás-derecha. Los flotadores son factores lineales para reducir (<1) o aumentar (> 1) el volumen del canal multiplicado. FL = FC + 0.30 * FL + 0.30 * BL está configurando el canal frontal izquierdo en el canal frontal central más el 30% de los canales frontal izquierdo y el 30% de los canales posterior izquierdo.
kronenpj
1
FWIW: Creo que esta mezcla hace que los diálogos sean demasiado fuertes en comparación con la música y los sonidos ambientales. La combinación técnicamente más correcta dada en la respuesta de Tarc es mucho más agradable para mí. Así que supongo que quizás tengas que probar lo que funciona mejor para ti, depende de la situación.
jlh
3

Entonces, combinando @Shane Harrelson con la respuesta de @Jordan Harris a otra pregunta , con el modo perezoso activado, aquí lo que se necesita para convertir input_51.mkv(5.1) en output_stereo.mkv(estéreo):

ffmpeg -i input_51.mkv -c:v copy \
    -ac 2 -af "pan=stereo|FL=FC+0.30*FL+0.30*BL|FR=FC+0.30*FR+0.30*BR" \
    output_stereo.mkv

Los -c:v copymedios de piezas que el flujo de vídeo no está siendo tocado (supongo que la v ideo c ODEC configuración es ser policía IED). Sin ella, tomará mucho más tiempo. Simplemente repitiendo la respuesta anterior para completar, -ac 2significa dos canales de audio y -afespecifica un filtro de audio.

Después de mirar un poco el comando, descubrí que está configurando cómo se componen los dos canales estéreo; el FL(canal frontal izquierdo) se toma del original FC(centro frontal) más 0.30*FL(30% desde el frente izquierdo) más 0.30*BL(30% desde el lado posterior izquierdo) y así sucesivamente.

Tarc
fuente
¿Esto mantendrá el canal central consistente y audible?
Freedo
2

Esta es una vieja pregunta ahora, pero me señaló en la dirección correcta y quería compartir mi resultado:

-af "pan=stereo|FL=0.5*FC+0.707*FL+0.707*BL+0.5*LFE|FR=0.5*FC+0.707*FR+0.707*BR+0.5*LFE"

Poner la mitad del FC y LFE en izquierda y derecha da un total de 1 para sus volúmenes efectivos de ambos altavoces. El uso de .707 * Delantero / trasero izquierdo / derecho reduce esos canales a un buen nivel para que no dominen el centro.

Dave_750
fuente
1

Si la opción -ac 2 le da una mezcla descendente equilibrada donde ni la música ni el discurso suenan demasiado más que los otros componentes, solo necesita aumentar el volumen con

-vol 512

Usé 512 en el ejemplo, lo que aumenta el sonido y lo hace dos veces más fuerte. La regla es que 256 es equivalente al 100%

No suba demasiado con el valor, y asegúrese de verificar los resultados en esas partes de la película con explosiones o ruidos fuertes. Es muy fácil introducir distorsión al usar un valor demasiado alto.

Mefisto
fuente
1

-ac 2

El volumen de canales en downmix no cambia con el códec de coma flotante -> pcm_f32le, aac

El volumen en downmix (5.1 a 2.0 sin LFE) se reduce en 1 / 2.5 = -7.96 dB con códec entero -> pcm_s16le, libfdk_aac

Las películas tienen sonido apuntando en una dirección, y no hay presión de sonido máxima en todos los canales. Por lo tanto, el volumen reducido de downmix es incorrecto, la compresión correcta de poco nivel es la correcta. Eso es lo que hace Dolby.

usuario1076138
fuente
0

Después de leer toda esta página y algunos experimentos, se me ocurrió este script llamado "down_mix":

#!/bin/bash -x

FL="0.5*FC + 0.707*FL + 0.707*BL + 0.5*LFE"
FR="0.5*FC + 0.707*FR + 0.707*BR + 0.5*LFE"
AUDIO_FMT="libopus"
CONTAINER="mkv"

ffmpeg -i "$1" -c:v copy -c:s copy \
    -c:a $AUDIO_FMT \
    -af "pan=stereo|FL=$FL|FR=$FR" \
    "${1%.*}"_dm.$CONTAINER

    # how to test a snippet of movie
    # -ss 41:07.0 -t 4 \

Ajusta las variables anteriores a tu gusto. No tuve ningún problema con el bajo volumen, así que lo dejé fuera, pero lo agregué fácilmente.

Gringo Suave
fuente
0

El filtro ffmpeg "-ac 2" funciona bien siempre que su objetivo esté codificado en pcm_s16le. Al codificar a pcm_f32le en formato wav, el volumen aumenta en 9dB y más. Por lo tanto: no use el filtro "-ac 2" en tales casos.

Frank-Michael Fischer
fuente
¿Por qué aumenta el volumen? ¿Dónde aprendiste sobre esto?
de1919
No tengo idea, por qué. Pero soy un usuario ffmpeg muy frecuente (lo compilo yo mismo). Simplemente tome cualquier fuente 5.1 (lateral) y conviértala en un archivo pcm_s16le y también en un archivo pcm_f32le wav usando "-ac 2" en ambas ocasiones. Compare los volúmenes máximos de los dos archivos wav y verá (y escuchará):
Frank-Michael Fischer
esto sucede usando, por ejemplo, la versión ffmpeg N-93636-g6829c3c
Frank-Michael Fischer