Faça downmix corretamente 5.1 para estéreo usando ffmpeg

27

Eu tenho uma faixa de áudio 5.1 de um filme em que a frente esquerda e a frente direita contêm música e o centro contém diálogo. Tocar a faixa 5.1 no VLC combina tudo bem.

Estou tentando converter a faixa 5.1 para estéreo usando ffmpeg -ac 2, no entanto, o mix estéreo resultante tem um volume muito mais fraco do que reproduzir a faixa 5.1 nativamente.

A adição -af "pan=stereo|c0=FL|c1=FR"fornece o volume correto, mas não há diálogo porque o canal central não está incluído.

Então a solução talvez seja misturar esquerda / centro / direita em estéreo e jogar fora os canais de subwoofer de back-end? (Eu estou supondo aqui ...)

Portanto, a pergunta é: como faço para que o ffmpeg downmix 5.1 seja estéreo da mesma forma que o VLC, com o mesmo volume forte no resultado final?

fortrina
fonte
Tem certeza de que o VLC está realmente reproduzindo os canais adicionais? O downmixing pode resultar em normalização, para que a soma de cada entrada por canal de saída não resulte em sobrecarga, impedindo o corte. Isso pode fazer com que pareça mais silencioso.
Llogan
O básico: Meu arquivo é 5.1. Meus alto-falantes são estéreo. Não sei o que o VLC faz, mas cria um ótimo resultado final nos meus alto-falantes estéreo a partir dos dados da fonte 5.1 (volume forte, incluindo música e diálogo). O ffmpeg, por outro lado, cria um resultado de "baixo volume" ao usar -ac 2. Então, eu estou perguntando como fazer o ffmpeg gerar o mesmo resultado bom que o VLC.
forthrin

Respostas:

28

Encontrei a resposta que Shane forneceu para fornecer muito pouco dos outros canais e muito do centro. Os filmes com fones de ouvido pareciam desequilibrados, com todo o diálogo e efeitos / música de fundo insuficientes.

De acordo com os padrões ATSC (seção 7.8, página 91), a fórmula a seguir é usada para downmix 5.1 ao estéreo convencional (ao contrário da matriz):

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

clev e slev devem ser 0,707, de acordo com as tabelas 5.9 e 5.10 no documento mencionado, assumindo um nível de mixagem central / surround igual a 0. Outros valores são fornecidos nessas tabelas que reduzem a quantidade de mixagem central, que eu não acho útil.

Com isso em mente, a seguinte opção ffmpeg produz um som equilibrado com diálogo audível. Observe que não é necessário especificar os canais de áudio.

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

Uma observação sobre o uso do símbolo menor que, na documentação do filtro de panela :

Se o '=' em uma especificação de canal for substituído por '<', os ganhos para essa especificação serão renormalizados para que o total seja 1, evitando assim o ruído de recorte.

Gregory
fonte
5
Os padrões ATSC aos quais você vinculou aqui foram vinculados ao wiki do FFmpeg sobre o tópico , portanto, não surpreende que a fórmula usada aqui seja a mesma implementada pelo FFmpeg com sua ac -2opção. Em outras palavras, a única diferença entre usar esse filtro e fazer ac -2é muito mais digitação.
Hashim
18

As respostas sobre essa questão tornaram-se uma bagunça, com muitas contendo informações redundantes e outras imprecisões completas. Esta resposta é uma tentativa de otimizar as informações nessas respostas, eliminando os problemas nelas.

Mais importante, vale lembrar que a resposta de Gregory, atualmente a resposta mais votada para esta pergunta, não é diferente do que usar a -ac 2opção - mais sobre isso abaixo.

Fazer downmixing de um fluxo de áudio de 5.1 canais para estéreo com -ac 2

O FFmpeg vem com recursos internos para mixagem de uma faixa 5.1 para estéreo, e esta também é a solução recomendada pela documentação do FFmpeg :

Nota: O ffmpeg integra um sistema padrão de down-mix (e up-mix) que deve ser preferido (a -acopção) sobre o filtro de pan, a menos que você tenha necessidades muito específicas.

O -ac 2switch funciona misturando proporções dos 5 primeiros canais do fluxo de 6 canais da fonte - Traseira esquerda, Traseira direita, Frente esquerda, Frente direita e Frente central - nos canais Frente esquerda e Frente direita do fluxo estéreo de saída:

insira a descrição da imagem aqui

Ao fazer isso, o áudio do canal LFE (o .1 em 5.1, reservado para o subwoofer e usado para efeitos profundos e de baixa frequência) é descartado completamente ao usar esta opção.

Infelizmente, em meus testes -ac 2resultou em níveis gerais de música e diálogo que eram os mais diferentes da fonte, tornando-a a fórmula de downmix que fornece a pior saída de todas as fórmulas que testei, embora você possa testá-lo e descobrir que ele fornece uma mistura bem adequada para as suas necessidades; nesse caso, usar qualquer outra fórmula seria um exagero para você.


Para misturar uma faixa DTS com -ac 2 sem transcodificá-la (ou seja, manter o codec e a extensão iguais):

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

Como apontado por Mephisto em sua resposta, se o diálogo e a música parecerem bem equilibrados entre si, mas simplesmente não tiverem volume, você poderá diminuir o mix do fluxo e aumentar seu volume:

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

Para a -volopção, 100% do volume na fonte é equivalente ao valor inteiro 256, e usar um valor maior que isso aumentará o volume geral do fluxo de áudio. No entanto, observe que isso pode resultar em distorção ou artefatos, especialmente durante as seções mais altas.

Para misturar um fluxo de áudio em estéreo e transcodificá-lo para o codec AC3, por exemplo:

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

Downmixing um fluxo de áudio de 5.1 canais para estéreo com um algoritmo de mix personalizado

Se você deseja uma downmix de mais alta qualidade ou é absolutamente necessário incluir o fluxo LFE em sua saída, pode usar a chave de filtro de áudio do FFmpeg ( -af) para downmix o áudio usando uma fórmula de mixagem personalizada.

Downmixing com a fórmula ATSC (resposta de Gregory)

No momento da publicação desta resposta, a resposta mais votada para essa pergunta era a de Gregory , que coloca a fórmula da especificação ATSC (consulte a seção 7.8.2, Fazendo downmixing em dois canais ) em um filtro de áudio FFmpeg. Essa especificação está diretamente vinculada à documentação do FFmpeg sobre o tópico , indicando que é altamente provável que seja a mesma fórmula que o FFmpeg já implementa para seu -ac 2switch. Se isso for verdade, digitar a fórmula inteira na resposta de Gregory não seria diferente do que usar o -ac 2comutador e, portanto, uma perda de tempo.

Decidi testar isso com certeza, recodificando a mesma entrada de áudio usando ambos -ac 2e o -affiltro da resposta de Gregory (os comandos exatos usados ​​podem ser vistos nas notas de rodapé desta resposta).

Em seguida, comparei os tamanhos dos arquivos de saída resultantes e constatei que eram, byte por byte, o mesmo tamanho:

insira a descrição da imagem aqui

Por fim, abri os dois arquivos de saída no Audacity e comparei suas formas de onda para confirmar que eram idênticas (clique para ampliar):

insira a descrição da imagem aqui

Parece, portanto, bastante conclusivo que a fórmula ATSC detalhada na resposta de Gregory é a mesma já implementada pelo FFmpeg , e que usá-la é totalmente redundante quando não faz nada que -ac 2não faz, e é um comando muito mais complicado.

Downmixing sem descartar o canal LFE (resposta de Dave_750)

Das várias incluídas nas respostas, essa é a única das fórmulas downmix que parecem misturar o canal LFE no estéreo de saída, em vez de descartá-lo completamente e, como resultado, o que garante o menor som da fonte é perdido.

O nível geral do volume é mais alto e mais cheio do -ac 2que o normal, mas também mais baixo que o downmix abaixo do Nightmode Dialogue. No entanto, os níveis de música estão muito mais próximos da fonte do que o downmix do Nightmode Dialogue e, devido à inclusão da faixa LFE, aumentar o volume da saída ao usar essa fórmula de downmix pode criar um fluxo de saída que soa mais fiel à fonte 5.1 do que todos os outros fórmulas que testei.

Se você tiver a capacidade, eu recomendo a codificação do (s) seu (s) fluxo (s) de áudio usando esta fórmula de downmix e o downmix Nightmode Dialogue e comparando cuidadosamente as formas de onda dos dois para determinar qual é o melhor.

Para misturar uma faixa 5.1 em estéreo usando essa fórmula e aumentar seu nível de volume para 425 (onde 256 é 100% do nível de volume da fonte 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"

Desmistificando o Diálogo do Modo Noturno de Robert Collier (resposta de Shane Harrelson)

A fórmula Diálogo noturno, criado por Robert Collier na Doom9 fórum e fontes de Shane Harrelson em sua resposta, resulta em uma melhor downmix que o -ac 2switch - em vez de diálogos excessivamente tranquilos, traz de volta a níveis que são muito mais perto da fonte.

Da descrição de Robert Collier da mistura:

Depois de converter muitas trilhas de filmes DTS de 5.1 para 2.0 usando o eac3to, encontrei os mapeamentos de canal padrão do eac3to para resultar em diálogos muito silenciosos e cenas de ação e música muito altas. Embora os coeficientes de downmix do canal eac3to tenham uma base científica, na maioria das vezes eles não soam bem na prática devido ao baixo volume de diálogo. Essa predefinição é para quem procura diálogos claros com a música do canal esquerdo e direito ainda sendo audível, mas mais em segundo plano.

Como você pode ver - o centro da frente (diálogos) entra corretamente agora e permanece no nível original - enquanto a música e as explosões continuam sendo um efeito de fundo e não o dominam. Essa predefinição resolve o problema de você precisar mexer constantemente com o botão de volume ao assistir ao DTS 5.1 convertido em filmes 2.0 para ouvir diálogos. (Especialmente para assistir filmes à noite, onde você não quer acordar outras pessoas, mas ainda quer ouvir diálogos).

Infelizmente, a música dessa fórmula downmix é muito menor do que na fonte 5.1 (que provavelmente foi projetada considerando a intenção de Collier de criar um mix "modo noturno") e devido à perda completa da faixa LFE, o áudio geral de saída não soar tão cheio ou próximo da fonte quanto a fórmula de Dave_750 com volume aprimorado .

No entanto, se por algum motivo você quiser evitar aumentar o volume geral do fluxo, o Nightmode Dialogue provavelmente seria sua melhor opção - embora, novamente, eu recomendo codificar seu fluxo de áudio para ambos e comparar cuidadosamente as formas de onda dos dois. .

Para fazer downmix com a fórmula do Nightmode Dialogue no 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" 

Resposta do Tarc

Essa resposta simplesmente coloca a fórmula de downmix do Nightmode Dialogue da resposta de Shane Harrelson em um comando para converter o fluxo de áudio em um contêiner MKV. Embora o comando fornecido nesta resposta funcione bem em um fluxo de áudio, a adaptação para uma faixa de áudio autônoma causaria o erro:

Filtragem e streamcopy não podem ser usados ​​juntos

Isso ocorre porque o codec de áudio não pode ser copiado durante a downmixing - como todas as outras alterações que o FFmpeg faz em um fluxo de saída, uma downmix exige que a faixa seja recodificada para que as alterações sejam aplicadas.

Este comando também incluiu uma -ac 2opção redundante que o FFmpeg teria ignorado.


Comandos de teste

Para demonstrar a confiabilidade dos testes que realizei para esta resposta, abaixo estão todos os comandos que usei para testar cada fórmula de downmix.

O comando test usado para a -ac 2opção:

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

O comando test usado para a resposta 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"

O comando test usado para a resposta 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"

O comando test usado para a resposta 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
fonte
11
Visão impressionante! Obrigado por tomar o tempo para compartilhar isso. Estranho, então, que -ac 2me deu um resultado inferior, para começar, o que levou à postagem original. Vou tentar novamente e, se possível, compartilhar um trecho de 5,1 que não produz um resultado satisfatório com a mixagem embutida. Também é muito bom saber que você pode fazer down-mix sem transcodificação!
forthrin 2/03/19
@forthrin Lembre-se de que codificação e transcodificação são duas coisas diferentes. A transcodificação converte de um codec / extensão para outro e a codificação para o mesmo codec / extensão. Você pode fazer downmix e aplicar outros efeitos FFmpeg a um fluxo sem transcodificação, mas não sem codificação. A ac -2opção também me deu o resultado mais inferior de todas as fórmulas de downmix, acho que isso é apenas uma falha na fórmula do padrão ATSC.
Hashim
Eu tentei isso agora. Parece que ffmpeg -i 5.1.mp4 -ac 2 2.mp4funciona, mas ffplay -i 5.1.mp4 -ac 2não funciona.
forthrin 11/03/19
9

Experimente esta downmix:

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

como sugerido por Robert Collier no fórum Doom9.

Shane Harrelson
fonte
2
O que significam todas essas opções? Se você os explicar, as pessoas poderão usar sua resposta para resolver problemas diferentes, em vez de apenas copiar e colar.
precisa saber é o seguinte
2
@DavidRicherby -ac = Canais de áudio (2 para estéreo), -af = Filtro de áudio
Cestarian
3
Tentei isso para um filme 5.1 e pelo menos o som estéreo de saída soou completamente bem para mim. Diálogo claro e nada mais parecia estar faltando. Seria ótimo se alguém com conhecimento de VLC pudesse compartilhar exatamente o que é feito no downmix padrão de 5,1 a 2,0 lá.
forthrin 8/07/16
2
@DavidRicherby: as opções dentro do filtro de áudio (-af) são: FL = Frente-esquerda; BL = traseira esquerda; FC = centro da frente; FR = Frente-direita; BR = Parte traseira direita. Os flutuadores são fatores lineares para reduzir (<1) ou aumentar (> 1) o volume do canal multiplicado. FL = FC + 0,30 * FL + 0,30 * BL está configurando o canal frontal esquerdo para o canal frontal central mais 30% dos canais frontal esquerdo e 30% dos canais esquerdo traseiro.
precisa saber é o seguinte
11
FWIW: Acho que essa mixagem faz com que os diálogos sejam muito altos em comparação com a música e os sons do ambiente. A mistura tecnicamente mais correta dada na resposta de Tarc é muito mais agradável para mim. Então, acho que você pode tentar o que funciona melhor para você, depende da situação.
JLH
3

Portanto, combinando a resposta de @Shane Harrelson com a resposta de @Jordan Harris para outra pergunta - com o modo preguiçoso ativado - aqui é necessário converter input_51.mkv(5.1) em 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

Os -c:v copymeios de peça que o fluxo de vídeo não está sendo tocado (eu acho que o v ideo c ODEC configurações está sendo policial IED). Sem ele, levará muito mais tempo. Apenas repetir a resposta acima para completar, -ac 2significa dois canais de áudio e -afespecifica um filtro de áudio.

Depois de examinar um pouco o comando, descobri que está definindo como os dois canais estéreo são compostos; o FL(canal frontal esquerdo) é retirado do original FC(centro frontal) mais 0.30*FL(30% da frente esquerda) mais 0.30*BL(30% da parte traseira esquerda) e assim por diante.

Tarc
fonte
Isso manterá o canal central consistente e audível?
Freedo 7/08/17
2

Esta é uma pergunta antiga agora, mas me apontou na direção certa e queria compartilhar meu 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"

Colocar metade do FC e LFE na esquerda e na direita dá um total de 1 para os volumes efetivos dos dois alto-falantes. O uso de .707 * Dianteiro / Traseiro Esquerdo / Direito reduz esses canais a um bom nível, para que não domine o centro.

Dave_750
fonte
1

Se a opção -ac 2 fornecer uma downmix equilibrada, em que nem a música nem a fala soam muito mais do que os outros componentes, você só precisa aumentar o volume com

-vol 512

Eu usei 512 no exemplo, o que aumenta o som, tornando-o duas vezes mais alto. A regra é que 256 é equivalente a 100%

Não exagere no valor e verifique os resultados nessas partes do filme com explosões ou ruídos altos. É muito fácil introduzir distorção usando um valor muito alto.

Mephisto
fonte
1

-ac 2

O volume de canais no downmix é inalterado com o codec de ponto flutuante -> pcm_f32le, aac

O volume no downmix (5.1 a 2.0 sem LFE) é reduzido em 1 / 2.5 = -7.96 dB com codec inteiro -> pcm_s16le, libfdk_aac

Os filmes têm o som apontado em uma direção e nenhuma pressão sonora máxima em todos os canais. Portanto, o volume reduzido de downmix está errado, pouca compactação de nível é o caminho certo. É isso que Dolby faz.

user1076138
fonte
0

Depois de ler esta página inteira e alguns experimentos, criei esse script chamado "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 \

Ajuste as variáveis ​​acima ao seu gosto. Não tive problemas com volume baixo, então deixei de fora, mas facilmente adicionei.

Gringo Suave
fonte
0

O filtro ffmpeg "-ac 2" funciona bem desde que seu destino seja codificado em pcm_s16le. Ao codificar para pcm_f32le no formato wav, o volume é aumentado em 9dB e mais. Portanto: não use o filtro "-ac 2" nesses casos.

Frank-Michael Fischer
fonte
Por que o volume aumentou? Onde você aprendeu sobre isso?
forthrin 24/04/19
Não faço ideia do porquê. Mas eu sou um usuário ffmpeg muito frequente (eu mesmo compilando). Pegue qualquer fonte 5.1 (lateral) e converta-a em um arquivo pcm_s16le e também em um arquivo wav pcm_f32le usando o "-ac 2" nas duas vezes. Comparar os volumes de pico dos dois arquivos WAV e você vai ver (e ouvir):
Frank-Michael Fischer
isso acontece usando, por exemplo ffmpeg versão N-93636-g6829c3c
Frank-Michael Fischer