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

24

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 ffmpeg -ac 2, mais le volume du mixage stéréo obtenu est beaucoup plus faible que celui de la piste 5.1 en mode natif.

L'ajout -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.

en avant
la source
Etes-vous sûr que VLC joue réellement les canaux supplémentaires? Le mixage à la baisse peut entraîner une normalisation de sorte que la somme de chaque entrée par canal de sortie n'entraîne pas de surcharge, empêchant ainsi l'écrêtage. Cela peut rendre le son plus silencieux.
llogan
Les bases: Mon fichier est 5.1. Mes haut-parleurs sont stéréo. Je ne sais pas ce que fait VLC, mais cela crée un excellent résultat final pour mes haut-parleurs stéréo à partir des données source 5.1 (volume élevé, musique et dialogue inclus). ffmpeg, en revanche, crée un résultat "faible volume" lors de l'utilisation -ac 2. Je demande donc comment faire en sorte que ffmpeg génère le même bon résultat que VLC.
Versout

Réponses:

27

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 les 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 note sur l'utilisation du symbole inférieur à, dans la documentation du filtre panoramique :

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

Gregory
la source
4
Les normes ATSC que vous avez liées ici étaient liées au wiki de FFmpeg sur le sujet . Il n’est donc pas surprenant que la formule utilisée ici soit la même que celle mise en œuvre par FFmpeg avec son ac -2commutateur. En d'autres termes, la seule différence entre utiliser ce filtre et faire ac -2est beaucoup plus de dactylographie.
Hashim
15

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, qui est actuellement la réponse la plus votée à cette question, ne diffère pas de l'utilisation du -ac 2commutateur - plus à ce sujet ci-dessous.

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

FFmpeg est livré avec des fonctionnalités intégrées pour mixer une piste 5.1 en stéréo, et 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 préféré (l' -acoption) au filtre panoramique, sauf si vous avez des besoins très spécifiques.

Le -ac 2commutateur mélange 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:

entrez la description de l'image ici

Ce faisant, l’audio provenant du canal LFE (le .1 en 5.1, réservé au subwoofer et utilisé pour les effets profonds et basse fréquence) est totalement ignoré lors de l’utilisation de cette option.

Malheureusement, mes tests ont -ac 2abouti à des niveaux globaux de musique et de dialogue très différents de la source, ce qui en fait la formule de mixage réduit qui produit le pire résultat de toutes les formules que j'ai testées, bien que vous puissiez le tester et le constater. 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 -ac 2 sans la transcoder (pour que son codec et son extension restent 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 -volcommutateur, 100% du volume de 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 mixer un flux audio en stéréo et le convertir au 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 publier cette réponse, la réponse la plus votée à cette question était celle de Gregory , qui place la formule tirée de la spécification ATSC (voir la section 7.8.2, Mixage réduit en deux canaux ) dans un filtre audio FFmpeg. Cette spécification est elle-même directement liée à 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 -ac 2commutateur. Si cela est vrai, taper toute la formule dans la réponse de Gregory ne serait pas différent de l'utilisation du -ac 2commutateur, et 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 2le -affiltre 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:

entrez la description de l'image ici

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):

entrez la description de l'image ici

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à utilisée par FFmpeg et que son utilisation est entièrement redondante si elle ne fait rien qui -ac 2ne le fait pas et constitue 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 -ac 2riche que prévu, mais reste également inférieur au mixage en dessous du mode 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 augmenter 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 fournie par Shane Harrelson dans sa réponse, aboutit à un mixage bien meilleur que le -ac 2commutateur - au lieu de dialogues trop calmes, elle les ramène à des niveaux beaucoup plus proches de la la source.

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

Après avoir converti de nombreuses pistes de film DTS de 5.1 à 2.0 à l’aide de eac3to, j’ai trouvé que les mappages de canaux eac3to par défaut donnaient lieu à 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 jouer avec 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 sonner aussi complet ou proche de la source que la formule de Dave_750 avec volume augmenté .

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 pour toutes les autres modifications apportées par FFmpeg à un flux de sortie, un mixage en aval nécessite que la piste soit recodée pour que les modifications soient appliquées.

Cette commande incluait également un -ac 2commutateur redondant 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' -ac 2option:

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"
Hashim
la source
1
Aperçu impressionnant! Merci d'avoir pris le temps de partager cela. Étrange alors, cela -ac 2m’a donné un résultat inférieur au départ, ce qui a motivé la publication originale. Je vais essayer à nouveau et si possible, partager un extrait 5.1 qui ne donne pas un résultat satisfaisant avec le mixage incorporé. Aussi très agréable de savoir que vous pouvez down-mixer sans transcodage!
Versout
@forthrin N'oubliez pas que l'encodage et le transcodage sont deux choses différentes. Le transcodage convertit un codec / une extension en un autre et le codage est converti en un même codec / une même extension. Vous pouvez sous-mélanger et appliquer d'autres effets FFmpeg à un flux sans transcodage, mais pas sans codage. L' ac -2option m'a donné le résultat le plus médiocre de toutes les formules de mixage réductif également, je pense que c'est simplement un échec de la formule de la norme ATSC.
Hashim
J'ai essayé ça maintenant. Il semble que cela ffmpeg -i 5.1.mp4 -ac 2 2.mp4fonctionne, mais ffplay -i 5.1.mp4 -ac 2ne fonctionne pas.
Fourry
8

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.

Shane Harrelson
la source
2
Qu'est-ce que toutes ces options signifient? Si vous les expliquez, les gens pourront utiliser votre réponse pour résoudre différents problèmes au lieu de simplement copier-coller.
David Richerby
2
@DavidRicherby -ac = Canaux audio (2 pour stéréo), -af = Filtre audio
Cestarian
3
Essayé cela pour un film 5.1 et au moins la sortie stéréo sonnait parfaitement pour moi. Un dialogue clair et rien ne semblait manquer. Ce serait formidable si quelqu'un avec la connaissance de VLC pouvait partager exactement ce qui est fait dans le downmix 5.1 à 2.0 par défaut.
Forward
2
@DavidRicherby: Les options du filtre audio (-af) sont les suivantes: FL = Front-left; BL = arrière gauche; FC = centre avant; FR = avant droit; BR = Arrière-droit. Les flotteurs sont des facteurs linéaires pour réduire (<1) ou augmenter (> 1) le volume du canal multiplié. FL = FC + 0.30 * FL + 0.30 * BL définit le canal avant gauche sur le canal avant centre plus 30% des canaux avant gauche et 30% des canaux arrière gauche.
kronenpj
1
FWIW: Je trouve que ce mix rend les dialogues trop forts comparés à la musique et aux sons ambiants. La combinaison techniquement plus correcte donnée dans la réponse de Tarc me plaît beaucoup plus. Je suppose donc que vous devrez peut-être essayer ce qui vous convient le mieux, cela dépend de la situation.
jlh
3

Donc, en combinant @Shane Harrelson avec la réponse de @Jordan Harris à 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 -c:v copypartie signifie que le flux vidéo n'est pas touché (je suppose que les v idéo c paramètres est en cours d' ODEC cop ied). Sans cela, cela prendra beaucoup plus de temps. Répéter simplement la réponse ci-dessus pour compléter, -ac 2signifie deux canaux audio et -afspé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. le FL(canal avant gauche) provient de l'original FC(centre avant) plus 0.30*FL(30% de l'avant gauche) plus 0.30*BL(30% de l'arrière gauche) et ainsi de suite.

Tarc
la source
Le canal central sera-t-il cohérent et audible?
Freedo
2

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.

Dave_750
la source
1

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.

Méphisto
la source
1

-ac 2

Le volume des canaux dans le mixage descendant est inchangé avec le codec à virgule flottante -> pcm_f32le, aac

Le volume en mixage abaissé (5.1 à 2.0 sans LFE) est réduit de 1 / 2.5 = -7.96 dB avec codec entier -> pcm_s16le, libfdk_aac

Les films ont un son pointé dans une direction et aucune pression sonore maximale sur tous les canaux. Il est donc faux de réduire le volume du mixage, une compression de niveau faible est la bonne solution. C'est ce que fait Dolby.

utilisateur1076138
la source
0

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é.

Gringo Suave
la source
0

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.

Frank-Michael Fischer
la source
Pourquoi le volume est-il augmenté? Où avez-vous appris à ce sujet?
Fourry le
Aucune idée pourquoi. Mais je suis un utilisateur très fréquent de ffmpeg (le compiler moi-même). Il suffit de prendre n’importe quelle source 5.1 (côté) et de la convertir en pcm_s16le et également en fichier wav pcm_f32le en utilisant "-ac 2" les deux fois. Comparez les volumes de pointe des deux fichiers wav et vous verrez (et entendrez):
Frank-Michael Fischer
cela se produit par exemple avec la version ffmpeg N-93636-g6829c3c
Frank-Michael Fischer