Effettivamente downmix 5.1 a stereo usando ffmpeg


27

Ho una traccia audio 5.1 da un film in cui anteriore sinistro e anteriore destro contiene musica e al centro contiene dialoghi. La riproduzione della traccia 5.1 in VLC mescola bene tutto insieme.

Sto cercando di convertire la traccia 5.1 in stereo usando ffmpeg -ac 2, tuttavia il mix stereo risultante ha un volume molto più debole rispetto alla riproduzione nativa della traccia 5.1.

L'aggiunta -af "pan=stereo|c0=FL|c1=FR"dà il volume corretto, ma poi non ci sono dialoghi perché il canale centrale non è incluso.

Quindi la soluzione è forse quella di mescolare sinistra / centro / destra in stereo e buttare via i canali del subwoofer back-end? (Sto indovinando qui ...)

Quindi la domanda è: come faccio a far downmix 5.1 di ffmpeg allo stesso modo in cui lo fa VLC, con lo stesso volume forte nel risultato finale?


Sei sicuro che VLC stia effettivamente riproducendo i canali aggiuntivi? Il downmix può comportare la normalizzazione in modo tale che la somma di ciascun ingresso per canale di uscita non comporti un sovraccarico, in modo da evitare il clipping. Questo può far sembrare più silenzioso.
Llogan,

Le basi: il mio file è 5.1. I miei altoparlanti sono stereo. Non so cosa faccia VLC, ma crea un ottimo risultato finale nei miei altoparlanti stereo dai dati sorgente 5.1 (volume forte, musica e dialoghi inclusi). ffmpeg, d'altra parte, crea un risultato "a basso volume" durante l'utilizzo -ac 2. Quindi sto chiedendo come fare in modo che ffmpeg generi lo stesso buon risultato di VLC.
Outrin

Risposte:


29

Ho trovato la risposta fornita da Shane per fornire troppo poco degli altri canali e troppo del centro. I film con le cuffie sembravano sbilanciati, con tutti i dialoghi e musica / effetti di sottofondo insufficienti.

Secondo gli standard ATSC (sezione 7.8, pagina 91), la seguente formula viene utilizzata per il downmix 5.1 allo stereo convenzionale (al contrario della matrice):

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

clev e slev dovrebbero essere .707, secondo le tabelle 5.9 e 5.10 nel documento sopra menzionato, assumendo un livello di mix centro / surround di 0. In queste tabelle sono forniti altri valori che riducono la quantità di mix centrale, che non trovo utile.

Con questo in mente, la seguente opzione ffmpeg produce un buon suono bilanciato con dialoghi udibili. Si noti che non è necessario specificare i canali 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 sull'uso del simbolo minore di, dalla documentazione del filtro pan :

Se '=' in una specifica di canale viene sostituito da '<', i guadagni per quella specifica verranno rinormalizzati in modo che il totale sia 1, evitando così il rumore di clipping.


5
Gli standard ATSC che hai collegato qui erano collegati dal wiki di FFmpeg sull'argomento , quindi non sorprende che la formula usata qui sia la stessa implementata da FFmpeg con il suo ac -2switch. In altre parole, l'unica differenza tra usare questo filtro e fare ac -2è scrivere molto di più.
Hashim,

@Hashim Non solo digitando. Una risposta con una spiegazione approfondita delle basi è oggettivamente migliore di "digitare questo per ottenerlo".
Sevastyan Savanyuk

18

Le risposte a questa domanda sono diventate da allora un po 'un casino, con molte informazioni ridondanti e altre complete inesattezze. Questa risposta è un tentativo di semplificare le informazioni in queste risposte eliminando i problemi in esse contenuti.

Soprattutto, vale la pena ricordare che la risposta di Gregory, attualmente la risposta più votata a questa domanda, non è diversa dall'uso -ac 2dell'interruttore, più su questo di seguito.

Downmix di un flusso audio a 5.1 canali su stereo con -ac 2

FFmpeg è dotato di funzionalità integrate per il downmixing di una traccia 5.1 in stereo e questa è anche la soluzione che la documentazione di FFmpeg raccomanda :

Nota: ffmpeg integra un sistema down-mix (e up-mix) predefinito che dovrebbe essere preferito (l' -acopzione) al filtro pan a meno che tu non abbia esigenze molto specifiche.

L' -ac 2interruttore funziona mescolando le proporzioni dei primi 5 canali dallo stream a 6 canali della sorgente - Back Left, Back Right, Front Left, Front Right e Front Center - nei canali Front Left e Front Right dello stream stereo di output:

inserisci qui la descrizione dell'immagine

Nel fare ciò, l'audio dal canale LFE (il .1 in 5.1, riservato al subwoofer e utilizzato per effetti profondi a bassa frequenza) viene completamente scartato quando si utilizza questa opzione.

Sfortunatamente, nei miei test ho -ac 2portato a livelli complessivi sia di musica che di dialogo che erano i più diversi dalla fonte, rendendola la formula di downmix che dà il peggior risultato tra tutte le formule che ho testato, anche se potresti testarlo e scoprirlo ti dà un downmix perfettamente adeguato per le tue esigenze, nel qual caso l'utilizzo di qualsiasi altra formula sarebbe eccessivo per te.


Per effettuare il downmix di una traccia DTS -ac 2 senza transcodificarla (ovvero mantenere lo stesso codec ed estensione):

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

Come sottolineato da Mephisto nella sua risposta, se il dialogo e la musica sembrano ben bilanciati l'uno con l'altro ma mancano semplicemente di volume, puoi downmixare il flusso aumentandone anche il volume:

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

Per lo -volswitch, il volume del 100% nella sorgente equivale al valore intero 256 e l'utilizzo di un valore maggiore di questo aumenterà il volume complessivo del flusso audio. Tuttavia, si noti che farlo troppo può provocare distorsioni o artefatti, specialmente durante le sezioni più rumorose.

Per downmixare un flusso audio in stereo e transcodificarlo nel codec AC3, ad esempio:

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

Downmix di un flusso audio a 5.1 canali su stereo con un algoritmo di mixaggio personalizzato

Se desideri un downmix di qualità più elevata o devi assolutamente includere il flusso LFE nell'output, puoi utilizzare l'interruttore del filtro audio di FFmpeg ( -af) per effettuare il downmix dell'audio utilizzando una formula di mix personalizzata.

Downmix con la formula ATSC (risposta di Gregory)

Al momento della pubblicazione di questa risposta, la risposta più votata a questa domanda è stata quella di Gregory , che inserisce la formula dalla specifica ATSC (vedere la sezione 7.8.2, Downmix in due canali ) in un filtro audio FFmpeg. Questa specifica è direttamente collegata alla documentazione FFmpeg sull'argomento , indicando che è altamente probabile che sia la stessa formula che FFmpeg implementa già per il suo -ac 2switch. Se questo è vero, quindi digitare l'intera formula nella risposta di Gregory non sarebbe diverso dall'uso -ac 2dell'interruttore, e quindi una perdita di tempo.

Ho deciso di testarlo con certezza ricodificando lo stesso audio di input usando entrambi -ac 2e il -affiltro dalla risposta di Gregory (i comandi esatti usati possono essere visti nelle note a piè di pagina di questa risposta).

Ho quindi confrontato le dimensioni dei file di output risultanti e ho scoperto che erano, byte per byte, le stesse dimensioni:

inserisci qui la descrizione dell'immagine

Alla fine, ho aperto entrambi i due file di output in Audacity e ho confrontato le loro forme d'onda per confermare che erano identici (clicca per ingrandire):

inserisci qui la descrizione dell'immagine

Sembra quindi abbastanza conclusivo che la formula ATSC descritta nella risposta di Gregory sia la stessa già implementata da FFmpeg e che utilizzarla sia completamente ridondante quando non fa nulla che -ac 2non lo faccia, ed è un comando molto più ingombrante.

Downmix senza eliminare il canale LFE (risposta di Dave_750)

Tra i vari inclusi nelle risposte, questa è l'unica delle formule di downmix che sembra mescolare il canale LFE nello stereo di uscita invece di scartarlo del tutto, e di conseguenza, quello che assicura che il minimo suono dalla sorgente sia perso.

Il livello generale del volume è più alto e più pieno di quanto non lo sia -ac 2, ma è comunque inferiore al downmix del dialogo Nightmode di seguito. Tuttavia, i livelli musicali sono molto più vicini alla sorgente rispetto al downmix del Dialogo notturno e, a causa dell'inclusione della traccia LFE, aumentare il volume dell'output mentre si utilizza questa formula di downmix può creare un flusso di output che suona più vero alla sorgente 5.1 rispetto a tutti gli altri formule che ho testato.

Se ne hai la capacità, ti consiglio vivamente di codificare i tuoi flussi audio usando sia questa formula di downmix che il downmix del Dialogo notturno, e confrontando attentamente le forme d'onda dei due per determinare quale è meglio.

Per eseguire il downmix di una traccia 5.1 su stereo usando questa formula e aumentare il suo volume a 425 (dove 256 è il 100% del livello del volume della sorgente originale):

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"

Downmix con il Nightmode Dialogue di Robert Collier (la risposta di Shane Harrelson)

La formula del Dialogo notturno, creata da Robert Collier sul forum di Doom9 e fornita da Shane Harrelson nella sua risposta, si traduce in un downmix molto migliore rispetto -ac 2all'interruttore: invece di dialoghi troppo silenziosi, li riporta a livelli molto più vicini al fonte.

Dalla descrizione del mix di Robert Collier:

Dopo aver convertito molte tracce di film DTS dalla 5.1 alla 2.0 usando eac3to, ho trovato le mappature predefinite del canale eac3to per dare vita a dialoghi molto silenziosi e scene di musica e azione eccessivamente rumorose. Sebbene i coefficienti di downmix di eac3to channel abbiano una base scientifica, spesso non suonano bene in pratica a causa del basso volume di dialogo. Questa preimpostazione è per coloro che cercano dialoghi chiari con la musica del canale sinistro e destro ancora udibile ma più in sottofondo.

Come puoi vedere - il centro anteriore (dialoghi) entra correttamente ora e resta al livello originale - mentre la musica e le esplosioni rimangono un effetto di fondo e non ti sopraffanno. Questa preimpostazione risolve il problema di dover costantemente giocherellare con la manopola del volume durante la visione di DTS 5.1 convertiti in filmati 2.0 per ascoltare dialoghi. (Soprattutto per guardare film di notte in cui non si desidera svegliare gli altri, ma si desidera comunque poter ascoltare i dialoghi).

Sfortunatamente, la musica di questa formula di downmix è molto più bassa rispetto alla sorgente 5.1 (che era probabilmente in base alla progettazione considerando l'intenzione di Collier di creare un mix "nightmode") e a causa della completa perdita della traccia LFE, l'audio in uscita complessivo non lo fa suono pieno o vicino alla fonte come la formula di Dave_750 con volume potenziato .

Tuttavia, se per qualche motivo si desidera evitare di aumentare il volume complessivo dello stream, il Nightmode Dialogue sarebbe probabilmente l'opzione migliore - anche se, ancora una volta, consiglio vivamente di codificare il flusso audio su entrambi e di confrontare attentamente le forme d'onda dei due .

Per effettuare il downmix con la formula del dialogo Modalità notte in 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 risposta di Tarc

Questa risposta inserisce semplicemente la formula di downmix del dialogo Nightmode dalla risposta di Shane Harrelson in un comando per convertire il flusso audio in un contenitore MKV. Mentre il comando dato in questa risposta funzionerebbe bene su un tale flusso audio, adattandolo per una traccia audio autonoma darebbe l'errore:

Filtro e streamcopy non possono essere usati insieme

Questo perché il codec audio non può essere copiato durante il downmix - come tutte le altre modifiche apportate da FFmpeg a un flusso di output, un downmix richiede che la traccia venga ricodificata per applicare le modifiche.

Questo comando includeva anche un'opzione ridondante -ac 2che FFmpeg avrebbe ignorato.


Comandi di test

Per dimostrare l'affidabilità dei test che ho condotto per questa risposta, di seguito sono riportati tutti i comandi che ho usato per testare ogni formula di downmix.

Il comando di test utilizzato per l' -ac 2opzione:

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

Il comando test usato per la risposta di 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"

Il comando di test utilizzato per la risposta di 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"

Il comando di test utilizzato per la risposta di 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"

1
Impressionante intuizione! Grazie per aver dedicato del tempo a condividere questo. Strano quindi, questo -ac 2mi ha dato un risultato inferiore per cominciare, che ha spinto la pubblicazione originale. Ci riproverò e, se possibile, condividerò un estratto 5.1 che non dà un risultato soddisfacente con il down-mix integrato. Inoltre è molto bello sapere che puoi effettuare il down-mix senza transcodifica!
Outrin

@forthrin Ricorda che la codifica e la transcodifica sono due cose diverse. La transcodifica viene convertita da un codec / estensione a un altro e la codifica viene convertita nello stesso codec / estensione. È possibile effettuare il downmix e applicare altri effetti FFmpeg a uno stream senza transcodifica, ma non senza codifica. L' ac -2opzione mi ha dato il risultato più basso di tutte le formule di downmix, penso che questo sia solo un fallimento della formula dello standard ATSC.
Hashim

L'ho provato ora. Sembra che ffmpeg -i 5.1.mp4 -ac 2 2.mp4funzioni, ma ffplay -i 5.1.mp4 -ac 2non lo fa.
Outrin

9

Prova questo downmix:

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

come suggerito da Robert Collier nel forum di Doom9.


2
Cosa significano tutte queste opzioni? Se le spieghi, le persone saranno in grado di utilizzare la tua risposta per risolvere diversi problemi anziché semplicemente incollare.
David Richerby,

2
@DavidRicherby -ac = Canali audio (2 per stereo), -af = Filtro audio
Cestarian

3
Ho provato questo per un film 5.1 e almeno lo stereo in uscita mi è sembrato completamente perfetto. Dialoghi chiari e nient'altro sembrava mancare. Sarebbe bello se qualcuno con conoscenza VLC potesse condividere esattamente ciò che viene fatto nel downmix predefinito da 5.1 a 2.0.
Outrin

2
@DavidRicherby: le opzioni all'interno del filtro audio (-af) sono: FL = Front-left; BL = Back-sinistra; FC = Front-center; FR = anteriore destro; BR = Back-destra. I float sono fattori lineari per ridurre (<1) o aumentare (> 1) il volume del canale moltiplicato. FL = FC + 0,30 * FL + 0,30 * BL sta impostando il canale anteriore sinistro sul canale centrale anteriore più il 30% dei canali anteriore sinistro e il 30% dei canali posteriore sinistro.
kronenpj,

1
FWIW: Trovo che questo mix renda i dialoghi troppo rumorosi rispetto alla musica e ai suoni ambientali. Il mix tecnicamente più corretto indicato nella risposta di Tarc è molto più piacevole per me. Quindi suppongo che potresti dover provare ciò che funziona meglio per te, dipende dalla situazione.
jlh

3

Quindi, combinando @Shane Harrelson con la risposta di @Jordan Harris a un'altra domanda - con la modalità pigra attivata - ecco cosa è necessario per convertire input_51.mkv(5.1) in output_stereo.mkv(stereo):

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

I -c:v copymezzi di parte che il flusso video non viene toccato (credo che il v ideo c ODEC impostazioni è essere cop Ied). Senza di essa, ci vorrà molto più tempo. Basta ripetere dalla risposta sopra per completezza, -ac 2significa due canali audio e -afspecifica un filtro audio.

Dopo aver esaminato un po 'il comando, ho capito che sta impostando come sono composti i due canali stereo; il FL(canale anteriore sinistro) è tratto dall'originale FC(centro anteriore) più 0.30*FL(30% da sinistra anteriore) più 0.30*BL(30% da sinistra posteriore) e così via.


Ciò manterrà il canale centrale coerente e udibile?
Freedo,

2

Questa è una vecchia domanda ora, ma mi ha indicato la giusta direzione e volevo condividere il mio risultato:

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

Mettendo la metà di FC e LFE a sinistra e a destra si ottiene un totale di 1 per i loro volumi effettivi da entrambi i diffusori. Usando .707 * Anteriore / Posteriore Sinistra / Destra porta quei canali ad un buon livello in modo da non sopraffare il centro.


1

Se l'opzione -ac 2 ti dà un downmix bilanciato in cui né la musica né il parlato suonano troppo più degli altri componenti, devi solo aumentare il volume con

-vol 512

Ho usato 512 nell'esempio, che aumenta il suono rendendolo due volte più forte. La regola è che 256 è equivalente al 100%

Non andare troppo in alto con il valore e assicurati di controllare i risultati in quelle parti del film con esplosioni o rumori forti. È molto facile introdurre la distorsione usando un valore troppo alto.


1

-ac 2

Il volume dei canali in downmix è invariato con il codec in virgola mobile -> pcm_f32le, aac

Il volume in downmix (da 5.1 a 2.0 senza LFE) è ridotto di 1 / 2.5 = -7.96 dB con codec intero -> pcm_s16le, libfdk_aac

I film hanno il suono puntato in una direzione e nessuna pressione sonora massima su tutti i canali. Quindi il volume di downmix ridotto è sbagliato, la compressione a basso livello è la strada giusta. Ecco cosa fa Dolby.


0

Dopo aver letto l'intera pagina e alcuni esperimenti, ho realizzato questo script chiamato "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 \

Modifica le variabili sopra a tuo piacimento. Non ho avuto problemi con il volume basso, quindi l'ho lasciato fuori, ma facilmente aggiunto.


0

Il filtro ffmpeg "-ac 2" funziona bene fintanto che il tuo target è codificato in pcm_s16le. Quando si codifica in pcm_f32le in formato wav, il volume viene aumentato di 9 dB e oltre. Quindi: in questi casi non utilizzare il filtro "-ac 2".


Perché il volume è aumentato? Dove l'hai imparato?
1919

Nessuna idea, perché. Ma sono un utente ffmpeg molto frequente (compilandolo da solo). Basta prendere qualsiasi sorgente 5.1 (laterale) e convertirla in un file pcm_s16le e anche in un file wav pcm_f32le usando entrambe le volte "-ac 2". Confronta i volumi di picco dei due file wav e vedrai (e sentirai):
Frank-Michael Fischer,

questo accade usando, ad esempio, la versione ffmpeg N-93636-g6829c3c
Frank-Michael Fischer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.