57 votes

Descendre correctement un mixage 5.1 en stéréo avec ffmpeg

J'ai une piste audio 5.1 d'un film où l'avant gauche et l'avant droit contiennent la musique, et le centre les dialogues. La lecture de la piste 5.1 dans VLC permet de tout mélanger joliment.

J'essaye de convertir la piste 5.1 en stéréo en utilisant ffmpeg -ac 2 Cependant, le mélange stéréo qui en résulte a un volume beaucoup plus faible que la lecture native de la piste 5.1.

Añadir -af "pan=stereo|c0=FL|c1=FR" donne le volume correct, mais il n'y a pas de dialogue car le canal central n'est pas inclus.

Donc la solution est peut-être de mixer gauche/centre/droite en stéréo, et de jeter les canaux de subwoofer de l'arrière ? (Je devine ici...)

La question est donc : comment faire pour que ffmpeg fasse un downmix 5.1 en stéréo de la même manière que VLC le fait, avec le même volume fort dans le résultat final ?

77voto

Hashim Aziz Points 10142

Les réponses à cette question sont depuis devenues un peu confuses, beaucoup contenant des informations redondantes et d'autres étant totalement inexactes. Cette réponse est une tentative de rationaliser l'information dans ces réponses tout en éliminant les problèmes qu'elles contiennent.

Plus important encore, il faut garder à l'esprit que la réponse de Gregory, qui est actuellement la réponse la plus votée à cette question, n'est pas différente de l'utilisation de la fonction -ac 2 interrupteur - plus d'informations à ce sujet ci-dessous.


Le downmixage d'un flux audio de 5.1 canaux en stéréo avec -ac 2

FFmpeg est livré avec des capacités intégrées pour le downmixage d'une piste 5.1 en stéréo, et c'est également la solution que la documentation de FFmpeg propose. recommande :

Remarque : ffmpeg intègre un système de down-mix (et up-mix) par défaut qui devrait être préféré (le -ac ) sur le filtre à cuvette, sauf si vous des besoins très spécifiques.

En -ac 2 Le commutateur fonctionne en mélangeant des proportions des 5 premiers canaux du flux à 6 canaux de la source - Back Left, Back Right, Front Left, Front Right et Front Center - dans les canaux Front Left et Front Right du flux stéréo de sortie :

enter image description here

Dans ce cas, l'audio provenant du canal LFE (le canal .1 en 5.1, réservé au subwoofer et utilisé pour des effets profonds et de basse fréquence) est complètement abandonné lorsque vous utilisez cette option.

Malheureusement, dans mes tests -ac 2 a donné des niveaux globaux de musique et de dialogue qui étaient les plus différents de la source, ce qui en fait la formule de downmix qui donne le plus mauvais résultat parmi toutes les formules que j'ai testées, bien que vous puissiez la tester et trouver qu'elle vous donne un downmix parfaitement adéquat pour vos besoins, auquel cas l'utilisation de toute autre formule serait excessive pour vous.


Pour downmixer une piste DTS avec -ac 2 なくしては le transcoder (c'est-à-dire conserver son codec et son extension) :

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

Comme l'a souligné Méphisto dans sa réponse, si les dialogues et la musique vous paraissent bien équilibrés entre eux mais manquent simplement de volume, vous pouvez downmixer le flux tout en augmentant son volume :

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

Pour le -vol le volume à 100% dans la source est équivalent à la valeur entière 256, et l'utilisation d'une valeur supérieure à celle-ci augmentera le volume global du flux audio. Cependant, notez que si vous le faites trop, cela peut entraîner une distorsion ou des artefacts, en particulier pendant les sections les plus fortes.

Pour convertir un flux audio en stéréo. et le transcoder au codec AC3, par exemple :

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

Downmixage d'un flux audio de 5.1 canaux en stéréo avec un algorithme de mixage personnalisé

Si vous voulez un downmix de plus haute qualité, ou si vous devez absolument inclure le flux LFE dans votre sortie, vous pouvez utiliser le commutateur de filtre audio de FFmpeg ( -af ) pour downmixer l'audio en utilisant une formule de mixage personnalisée.

Downmixing avec la formule ATSC (réponse de Gregory)

Au moment de la publication de cette réponse, la réponse la plus votée à cette question est la suivante Gregory qui met la formule du Spécification ATSC (voir la section 7.8.2, Downmixage sur deux canaux ) dans un filtre audio FFmpeg. Cette spécification est elle-même directement liée à par la documentation FFmpeg sur le sujet ce qui indique qu'il est fort probable qu'il s'agisse de la même formule que celle que FFmpeg met déjà en œuvre pour son -ac 2 un interrupteur. Si c'est vrai, alors taper la formule entière dans la réponse de Gregory ne serait pas différent de l'utilisation de l'interrupteur -ac 2 et donc une perte de temps.

J'ai décidé de tester cela en ré-encodant le même fichier audio d'entrée en utilisant les deux méthodes suivantes -ac 2 y el -af filtre de la réponse de Grégoire (les commandes exactes utilisées peuvent être vues dans les notes de bas de page de cette réponse).

J'ai ensuite comparé les tailles des fichiers de sortie résultants et j'ai constaté qu'ils étaient, octet par octet, de la même taille :

enter image description here

Enfin, j'ai ouvert les deux fichiers de sortie dans Audacity, et j'ai comparé leurs formes d'onde pour confirmer qu'elles étaient identiques (cliquez pour agrandir) :

enter image description here

Il semble donc assez concluant que la formule de l'ATSC détaillée dans la réponse de Gregory soit la formule de l'ATSC. le même que celui déjà implémenté par FFmpeg et que son utilisation est tout à fait superflue lorsqu'elle ne fait rien d'autre qu'une chose. -ac 2 ne le fait pas, et est une commande beaucoup plus lourde.

Downmixage sans suppression du canal LFE (réponse de Dave_750)

Parmi les différentes formules incluses dans les réponses, c'est la seule qui semble mélanger le canal LFE dans la sortie stéréo au lieu de l'éliminer complètement, et par conséquent, celle qui garantit que le moins de son de la source est perdu.

Le niveau de volume général est plus élevé et plus complet qu'en faisant -ac 2 mais également plus faible que le downmix Nightmode Dialogue ci-dessous. Cependant, les niveaux de musique sont beaucoup plus proches de la source que le downmix Nightmode Dialogue, et en raison de l'inclusion de la piste LFE, augmenter le volume de la sortie tout en utilisant cette formule de downmix peut créer un flux de sortie qui sonne plus fidèlement à la source 5.1 que toutes les autres formules que j'ai testées.

Si vous en avez la possibilité, je vous recommande vivement d'encoder votre/vos flux audio en utilisant à la fois cette formule de downmix et le downmix Nightmode Dialogue, et de comparer soigneusement les formes d'onde des deux pour déterminer laquelle est la meilleure.

Pour downmixer une piste 5.1 en stéréo en utilisant cette formule et augmenter son niveau de volume à 425 (où 256 correspond à 100% du niveau de volume de la source originale) :

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

Downmixing avec le dialogue Nightmode de Robert Collier (réponse de Shane Harrelson)

La formule Dialogue Nightmode, créée par Robert Collier sur le Doom9 et cité par Shane Harrelson dans sa réponse, permet d'obtenir un bien meilleur downmix que le -ac 2 Au lieu de dialogues trop silencieux, il les ramène à des niveaux beaucoup plus proches de la source.

Extrait de la description du mélange de Robert Collier :

Après avoir converti de nombreuses pistes de films DTS de 5.1 en 2.0 à l'aide d'eac3to, j'ai constaté que les mappages de canaux par défaut d'eac3to donnaient lieu à des dialogues très silencieux et à une musique et des scènes d'action trop fortes. Bien que les coefficients de downmixage des canaux eac3to aient une base scientifique, ils ne sonnent souvent pas bien dans la pratique en raison du faible volume des dialogues. Ce préréglage est destiné à ceux qui recherchent des dialogues clairs, la musique des canaux gauche et droit étant toujours audible, mais plutôt en arrière-plan.

Comme vous pouvez le constater, le centre avant (dialogues) est maintenant bien placé et reste au niveau original, tandis que la musique et les explosions restent un effet de fond et ne vous dominent pas. Ce préréglage résout le problème de devoir constamment tripoter le bouton de volume lorsque vous regardez des films DTS 5.1 convertis en 2.0 afin d'entendre les dialogues. (En particulier pour regarder des films la nuit où vous ne voulez pas réveiller les autres mais voulez quand même pouvoir entendre les dialogues).

Malheureusement, la musique de cette formule de downmix est beaucoup plus faible que dans la source 5.1 (ce qui était probablement à dessein compte tenu de l'intention de Collier de créer un mixage "nightmode") et en raison de la perte complète de la piste LFE, l'audio de sortie globale ne sonne pas aussi complet ou proche de la source que la formule de Dave_750. avec un volume amplifié .

Cependant, si pour une raison ou une autre vous voulez éviter d'augmenter le volume global du flux, alors le Nightmode Dialogue sera probablement votre meilleure option - bien qu'encore une fois, je recommande fortement d'encoder votre flux audio sur les deux et de comparer soigneusement les formes d'onde des deux.

Pour downmixer avec la formule Nightmode Dialogue dans FFmpeg :

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

Réponse de Tarc

Cette réponse met simplement la formule de downmixage Nightmode Dialogue de la réponse de Shane Harrelson dans une commande pour convertir le flux audio dans un conteneur MKV. Alors que la commande donnée dans cette réponse fonctionnerait bien sur un tel flux audio, l'adapter pour une piste audio autonome donnerait l'erreur :

Le filtrage et la copie de flux ne peuvent pas être utilisés ensemble.

Ceci est dû au fait que le codec audio ne peut pas être copié lors du downmixing - comme toutes les autres modifications que FFmpeg apporte à un flux de sortie, un downmixing nécessite que la piste soit ré-encodée pour que les changements soient appliqués.

Cette commande comprenait également une redondance -ac 2 que FFmpeg aurait ignoré.


Commandes de test

Pour démontrer la fiabilité des tests que j'ai effectués pour cette réponse, vous trouverez ci-dessous toutes les commandes que j'ai utilisées pour tester chaque formule de downmix.

La commande de test utilisée pour le <code>-ac 2</code> option :

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

La commande de test utilisée pour la réponse de Gregory :

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

La commande de test utilisée pour la réponse de Dave_750 :

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

La commande de test utilisée pour la réponse de Shane Harrelson :

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -af "pan=stereo|FL=FC+0.30*FL+0.30*c4|FR=FC+0.30*FR+0.30*c5" "Audio 3 (Nightmode Dialogue Downmix).wav"

32voto

Gregory Points 428

J'ai trouvé que la réponse fournie par Shane offrait trop peu des autres canaux et trop du centre. Les films diffusés au casque semblaient déséquilibrés, avec tous les dialogues et pas assez de musique de fond/effets.

Selon Normes ATSC (section 7.8, page 91), la formule suivante est utilisée pour le downmix 5.1 en stéréo conventionnel (par opposition à la matrice) :

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

clev et slev devraient être de 0,707, selon les tableaux 5.9 et 5.10 du document susmentionné, en supposant un niveau de mixage centre/arrière de 0. D'autres valeurs sont fournies dans ces tableaux qui réduisent la quantité de mixage central, ce que je ne trouve pas utile.

En gardant cela à l'esprit, l'option ffmpeg suivante produit un son bien équilibré avec des dialogues audibles. Notez qu'il n'est pas nécessaire de spécifier les canaux audio.

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

Une note sur l'utilisation du symbole "moins que", tirée de l'étude de la Commission européenne sur la protection de l'environnement. documentation sur le filtre à casseroles :

Si le '=' dans une spécification de canal gains pour cette spécification seront renormalisés afin que le total soit de 1. 1, évitant ainsi le bruit d'écrêtage.

12voto

Shane Harrelson Points 147

Essayez ce downmix :

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

comme suggéré par Robert Collier dans le forum Doom9.

5voto

Victor Points 215

RFC 7845 Section 5.1.1.5 possède des coefficients pour divers downmixes stéréo, qui préservent le LFE.

$ ffmpeg -i INFILE -c:a libopus -b:a 256k -af "pan=stereo|OUTDEFS" OUTFILE

Remplacer INFILE y OUTFILE avec les noms de fichiers, et OUTDEFS avec la définition ci-dessous (le saut de ligne étant remplacé par un espace) :

Downmixage d'un surround 5.1 en stéréo

FL, FC, FR, BL, BR, LFE -> FL, FR

FL = 0.374107*FC + 0.529067*FL + 0.458186*BL + 0.264534*BR + 0.374107*LFE |
FR = 0.374107*FC + 0.529067*FR + 0.458186*BR + 0.264534*BL + 0.374107*LFE

7.1 Surround

FL, FC, FR, SL, SR, BL, BR, LFE -> FL, FR

FL = 0.274804*FC + 0.388631*FL + 0.336565*SL + 0.194316*SR + 0.336565*BL + 0.194316*BR + 0.274804*LFE |
FR = 0.274804*FC + 0.388631*FR + 0.336565*SR + 0.194316*SL + 0.336565*BR + 0.194316*BL + 0.274804*LFE

6.1 Surround

FL, FC, FR, SL, SR, BC, LFE -> FL, FR

FL = 0.321953*FC + 0.455310*FL + 0.394310*SL + 0.227655*SR + 278819*BC + 0.321953*LFE |
FR = 0.321953*FC + 0.455310*FR + 0.394310*SR + 0.227655*SL + 278819*BC + 0.321953*LFE

5.0 Surround

FL, FC, FR, BL, BR -> FL, FR

FL = 0.460186*FC + 0.650802*FL + 0.563611*BL + 0.325401*BR |
FR = 0.460186*FC + 0.650802*FR + 0.563611*BR + 0.325401*BL

Canal quadriphonique

FL, FR, BL, BR -> FL, FR

FL = 0.422650*FL + 0.366025*BL + 0.211325*BR |
FR = 0.422650*FR + 0.366025*BR + 0.211325*BL

Canal Surround linéaire

FL, FC, FR -> FL, FR

FL = 0.414214*FC + 0.585786*FL |
FR = 0.414214*FC + 0.585786*FR

Le RFC explique comment ils ont choisi les coefficients :

Les implémentations PEUVENT utiliser les matrices des figures 4 à 9 pour pour mettre en œuvre le downmixage à partir de fichiers multicanaux en utilisant la famille 1 de mappage de canaux (section 5.1.1.2). famille 1 (section 5.1.1.2), qui sont connues pour donner des résultats acceptables. résultats acceptables pour la stéréo. Les matrices pour 3 et 4 canaux sont normalisées de façon à ce que chaque rangée de coefficients soit égale à 1 pour éviter l'écrêtage. Pour 5 canaux ou plus 5 canaux ou plus, elles sont normalisées à 2, ce qui constitue un compromis entre l'écrêtage et la réduction de la gamme dynamique.

Dans ces matrices, les canaux avant-gauche et avant-droit sont généralement transmis directement. Lorsqu'un canal surround est réparti entre les canaux stéréo gauche et droit, les coefficients sont coefficients sont choisis de manière à ce que leur somme au carré soit égale à 1, ce qui permet de préserver l'intensité perçue. intensité perçue. Les canaux arrière sont mixés de manière plus diffuse ou atténuée pour pour maintenir la concentration sur les canaux avant.


D'après cette réponse il est également possible d'utiliser -ac 2 y -lfe_mix_level <level> pour inclure le LFE.

$ ffmpeg -i INFILE -c:a libopus -b:a 256k -ac 2 -lfe_mix_level 1 OUTFILE

4voto

DorD Points 66

Ainsi, en combinant @Shane Harrelson's avec @Jordan Harris réponse à une autre question - avec le mode paresseux activé - voici ce qui est nécessaire pour convertir input_51.mkv (5.1) en output_stereo.mkv (stéréo) :

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

En -c:v copy signifie que le flux vidéo n'est pas touché (j'imagine que la partie v idéo c Les paramètres de l'odec sont flic ied). Sans cela, cela prendra beaucoup plus de temps. Je répète simplement la réponse ci-dessus pour être complet, -ac 2 signifie deux canaux audio et -af spécifie un filtre audio.

Après avoir examiné un peu la commande, j'ai découvert qu'elle définit la manière dont les deux canaux stéréo sont composés ; le bouton FL (canal avant gauche) est extrait de l'original. FC (au centre avant) plus 0.30*FL (30% à partir de l'avant gauche) plus 0.30*BL (30% de l'arrière gauche) et ainsi de suite.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X