web-dev-qa-db-fra.com

Réduisez correctement le 5.1 en stéréo en utilisant ffmpeg

J'ai une piste audio 5.1 d'un film dont l'avant gauche et l'avant droite contiennent de la musique et le centre des dialogues. La lecture de la piste 5.1 dans VLC associe parfaitement tout.

J'essaie de convertir la piste 5.1 en stéréo à l'aide de ffmpeg -ac 2. Cependant, le mixage stéréo résultant a un volume beaucoup plus faible que celui de la lecture de la piste 5.1 en mode natif.

Ajouter -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 mélanger la gauche/centre/droite en stéréo et de jeter les canaux de subwoofer arrière? (Je devine ici ...)

La question est donc de savoir comment rendre ffmpeg downmix 5.1 en stéréo de la même manière que VLC, avec le même volume élevé au final.

24
forthrin

J'ai trouvé la réponse fournie par Shane pour fournir trop peu des autres canaux et trop du centre. Les films avec des écouteurs 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 permet de passer de la version 5.1 à la stéréo classique (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 égaux à 0,707, conformément aux tableaux 5.9 et 5.10 du document susmentionné, en supposant un niveau de mixage centre/surround de 0. D'autres valeurs sont fournies dans ces tableaux, ce qui réduit l'ampleur du mixage central, ce que je ne trouve pas utile.

En gardant cela à l’esprit, l’option ffmpeg suivante produit un son bien équilibré avec un dialogue audible. Notez que la spécification des canaux audio n'est pas nécessaire.

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

Une remarque sur l'utilisation du symbole inférieur à, à partir de la documentation du filtre panoramique :

Si le "=" dans une spécification de canal est remplacé par "<", les gains de cette spécification seront renormalisés de sorte que le total soit égal à 1, évitant ainsi le bruit de clipping.

27
Gregory

Les réponses à cette question sont depuis devenues un peu un bordel, avec beaucoup contenant des informations redondantes et d'autres des inexactitudes complètes. Cette réponse est une tentative de rationaliser les informations contenues dans ces réponses tout en éliminant leurs problèmes.

Plus important encore, il convient de garder à l'esprit que la réponse de Gregory, actuellement la réponse la plus votée à cette question, ne diffère pas de l'utilisation du commutateur ac -2 - pour plus d'informations à ce sujet ci-dessous.

Mélanger à la baisse un flux audio 5.1 canaux en stéréo avec ac -2

FFmpeg intègre des fonctionnalités permettant de mixer une piste 5.1 en stéréo. C'est également la solution recommandée par la documentation de FFmpeg :

Remarque: ffmpeg intègre un système par défaut de mixage descendant (et de mixage ascendant) qui devrait être privilégié (l'option -ac) par rapport au filtre de panoramique, sauf si vous avez des besoins très spécifiques.

Le commutateur -ac 2 fonctionne en mélangeant les proportions des 5 premiers canaux du flux 6 canaux de la source - Arrière Gauche, Arrière Droite, Avant Gauche, Avant Droite et Avant Centre - dans les canaux Avant Gauche et Avant Droite du flux stéréo de sortie:

enter image description here

Pour ce faire, l’audio du canal LFE (le . 1 en 5.1, réservé au subwoofer et utilisé pour les effets profonds et basse fréquence) est complètement éliminé lors de l’utilisation de cette option.

Malheureusement, dans mes tests, ac -2 a abouti à des niveaux globaux de musique et de dialogue très différents de la source, ce qui en fait la formule de mixage réducteur qui produit le pire résultat de toutes les formules que j'ai testées, bien que vous puissiez le tester et le constater. cela vous donne un mélange parfaitement adapté à vos besoins. Dans ce cas, utiliser une autre formule serait excessif pour vous.


Pour mixer une piste DTS avec -ac 2 sans la transcoder (c'est-à-dire pour garder son codec et son extension identiques):

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

Comme Mephisto l'a souligné dans sa réponse, si le dialogue et la musique vous paraissent équilibrés mais manquent simplement de volume, vous pouvez sous-mélanger le flux tout en augmentant son volume:

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

Pour le commutateur -vol, un volume de 100% dans la source équivaut à la valeur entière 256 et l'utilisation d'une valeur supérieure à cette valeur augmente le volume global du flux audio. Cependant, notez que trop vous risquez de générer de la distorsion ou des artefacts, en particulier pendant les périodes les plus fortes.

Pour convertir un flux audio en stéréo et , convertissez-le en codec AC3, par exemple:

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

Mélanger à la baisse un flux audio 5.1 canaux en stéréo avec un algorithme de mixage personnalisé

Si vous voulez un mixage réducteur de meilleure 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 réduire le mixage audio à l'aide d'une formule de mixage personnalisée.

Mélanger avec la formule ATSC (réponse de Gregory)

Au moment de poster cette réponse, la réponse la plus votée à cette question était de Gregory , ce qui met la formule tirée du Spécification ATSC (voir la section 7.8.2, la réduction du mélange en deux canaux ) dans un filtre audio FFmpeg. Cette spécification est elle-même directement liée à par la documentation de FFmpeg sur le sujet , indiquant qu'il est fort probable que ce soit la même formule que FFmpeg implémente déjà pour son commutateur ac -2 . Si cela est vrai, taper toute la formule dans la réponse de Gregory ne serait pas différent de l'utilisation du commutateur ac -2 et serait donc une perte de temps.

J'ai décidé de tester cela avec certitude en réencodant la même entrée audio en utilisant à la fois ac -2 et le filtre -af de la réponse de Gregory (les commandes exactes utilisées sont visibles dans les notes de bas de page associées à cette réponse).

J'ai ensuite comparé les tailles des fichiers de sortie résultants et trouvé qu'elles é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 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 ATSC détaillée dans la réponse de Gregory soit la même que celle déjà mise en œuvre par FFmpeg , et que son utilisation est entièrement redondante si rien ne vaut ac -2. , et est une commande beaucoup plus lourde.

Mélanger à la baisse sans rejeter le canal LFE (réponse de Dave_750)

Parmi les réponses incluses, c’est la seule formule parmi les formules de mixage réducteur qui semble mélanger le canal LFE dans la sortie stéréo au lieu de l’écarter complètement. Par conséquent, celle qui garantit le moins de son de la source est: perdu.

Le niveau de volume général est plus élevé et plus complet que celui de ac -2, mais reste également inférieur au mixage au-dessous de Nightmode Dialogue. Cependant, les niveaux de musique sont beaucoup plus proches de la source que le mixage réducteur Nightmode Dialogue et, en raison de l’inclusion de la piste LFE, augmenter le volume de la sortie tout en utilisant cette formule de mixage réducteur peut créer un flux de sortie plus fidèle à la source 5.1 que tous les autres. formules que j'ai testées.

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

Pour mixer une piste 5.1 en stéréo en utilisant cette formule et , augmentez son niveau de volume à 425 (où 256 correspond à 100% du niveau de volume de la source d'origine):

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"

Mélangez à fond avec Nightmode Dialogue de Robert Collier (réponse de Shane Harrelson)

La formule Nightmode Dialogue, créée par Robert Collier sur le forum Doom9 et Source: Shane Harrelson dans sa réponse, il en résulte un mixage numérique bien meilleur que le commutateur ac -2 - au lieu de dialogues trop calmes, il les ramène à des niveaux beaucoup plus proches de la source.

D'après la description du mélange faite par Robert Collier:

Après avoir converti de nombreux DTS pistes de film de 5.1 à 2.0 à l'aide de eac3to, j'ai trouvé que les mappages de canaux eac3to par défaut entraînaient des dialogues très calmes et des scènes de musique et d'action trop fortes. Bien que les coefficients de sous-mixage de chaque canal aient une base scientifique, ils ne sonnent souvent pas bien dans la pratique en raison du faible volume de dialogue. Ce préréglage est destiné à ceux qui recherchent des dialogues clairs, la musique des canaux gauche et droit étant toujours audible mais davantage en arrière-plan.

Comme vous pouvez le constater - le centre de la scène (dialogues) entre correctement maintenant et reste au niveau d'origine - tandis que la musique et les explosions restent un effet de fond et ne vous accablent pas. Ce préréglage résout le problème de devoir constamment manipuler le bouton de volume lorsque vous regardez DTS 5.1 converti en vidéos 2.0 afin d'entendre les dialogues. (Surtout pour regarder des films la nuit où vous ne voulez pas réveiller les autres, mais voulez quand même pouvoir entendre des dialogues).

Malheureusement, la musique de cette formule de downmix est beaucoup plus basse que dans la source 5.1 (ce qui était probablement voulu par la conception compte tenu de l'intention de Collier de créer un mix "mode nuit") et, en raison de la perte complète de la piste LFE, la sortie audio globale ne son aussi complet ou proche de la source que la formule de Dave_750 avec volume boosté .

Toutefois, si, pour une raison quelconque, vous souhaitez éviter d'augmenter le volume global du flux, le dialogue Nightmode sera probablement votre meilleure option. Néanmoins, je vous recommande fortement d'encoder votre flux audio aux deux et de comparer soigneusement les formes d'onde des deux. .

Pour mixer avec la formule Nightmode Dialogue dans 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 réponse de Tarc

Cette réponse place simplement la formule de mixage à la baisse Nightmode Dialogue issue de la réponse de Shane Harrelson dans une commande permettant de convertir le flux audio dans un conteneur MKV. Alors que la commande donnée dans cette réponse fonctionnerait correctement sur un tel flux audio, son adaptation à une piste audio autonome produirait l'erreur suivante:

Filtrage et copie de flux ne peuvent pas être utilisés ensemble

Cela est dû au fait que le codec audio ne peut pas être copié lors du mixage en aval. Comme toutes les autres modifications apportées par FFmpeg à un flux de sortie, un mixage en aval requiert que la piste soit recodée pour que les modifications soient appliquées.

Cette commande incluait également un commutateur redondant 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, voici toutes les commandes que j'ai utilisées pour tester chaque formule de sous-mixage.

La commande de test utilisée pour l'option ac -2:

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*BL|FR < 1.0*FR + 0.707*FC + 0.707*BR" "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*BL+0.5*LFE|FR=0.5*FC+0.707*FR+0.707*BR+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*BL|FR=FC+0.30*FR+0.30*BR" "Audio 3 (Nightmode Dialogue Downmix).wav"
10
Hashim

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 sur le forum Doom9.

8
Shane Harrelson

Donc, en combinant @ Shane Harrelson avec @Jordan Harris répond à une autre question - avec le mode paresseux activé - voici ce qu'il faut 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

La partie -c:v copy signifie que le flux vidéo n’est pas touché (je suppose que les paramètres v ideo c sont en cours cop ied). Sans cela, cela prendra beaucoup plus de temps. Répétant simplement la réponse ci-dessus pour la complétude, -ac 2 signifie deux canaux audio et -af spécifie un filtre audio.

Après avoir examiné un peu la commande, je me suis rendu compte que cela définissait la composition des deux canaux stéréo. la FL (canal avant gauche) est tirée de la FC (centre avant) d'origine plus 0.30*FL (30% de l'avant gauche) plus 0.30*BL (30% de l'arrière gauche), etc.

3
Tarc

C'est une vieille question maintenant, mais m'a dirigé dans la bonne direction et voulait partager mon résultat:

-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"

Le fait de placer la moitié des FC et des LFE à gauche et à droite donne un total de 1 pour leurs volumes effectifs des deux haut-parleurs. L’utilisation de .707 * Avant/Arrière Gauche/Droite ramène ces canaux à un bon niveau pour qu’ils ne surchargent pas le centre.

2
Dave_750

Si l’option -ac 2 vous offre un mixage final équilibré dans lequel ni la musique ni la parole ne sonne beaucoup plus que les autres composants, il vous suffit d’augmenter le volume avec

-vol 512

J'ai utilisé 512 dans l'exemple, ce qui augmente le son en le rendant deux fois plus fort. La règle est que 256 est équivalent à 100%

N'allez pas trop haut avec la valeur, et assurez-vous de vérifier les résultats dans les parties du film avec des explosions ou des bruits forts. Il est très facile d'introduire une distorsion en utilisant une valeur trop élevée.

1
Mephisto

Après avoir lu toute cette page et quelques expériences, j'ai créé ce script appelé "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 \

Ajustez les variables ci-dessus à votre convenance. Je n'ai pas eu de problème avec le faible volume, donc je l'ai omis, mais facilement ajouté.

0
Gringo Suave

Le filtre ffmpeg "-ac 2" fonctionne bien tant que votre cible est encodée en pcm_s16le. Lors de l’encodage au format wav de pcm_f32le, le volume est augmenté de 9 dB et plus. Par conséquent: n'utilisez pas le filtre "-ac 2" dans de tels cas.

0