Converter áudio dentro de MKV para AC3 ou DTS preservando 6.1 canais

4

Eu tenho alguns arquivos .mkv que contêm áudio 6.1 no formato FLAC. mediainfo informa a faixa de áudio nesses arquivos como:

Audio
ID                       : 2
Format                   : FLAC
Format/Info              : Free Lossless Audio Codec
Codec ID                 : A_FLAC
Duration                 : 2mn 29s
Bit rate mode            : Variable
Channel(s)               : 7 channels
Channel positions        : Front: L C R, Side: L R, Back: C, LFE 
Sampling rate            : 48.0 KHz
Bit depth                : 24 bits
Delay relative to video  : 14ms
Writing library          : libFLAC 1.3.0 (UTC 2013-05-26)
Language                 : English
Default                  : Yes
Forced                   : No

Eu também tenho um "Home Theater" de 6.1 amp (Sony STR-DE895 , se alguém se importa) que aceita áudio digital nativamente através de uma conexão S / PDIF (óptica e coaxial) nos seguintes formatos:

  • PCM (limitado a 2 canais em S / PDIF)
  • DTS (5.1)
    • DTS-ES (6.1)
    • NEO6 (6.1)
  • Dolby Digital (5.1)
    • DIGITAL-EX (6.1)
    • PRO LOGIC II

Eu gostaria de ter esses arquivos .mkv direcionando todos os alto-falantes 6.1 do amplificador, mas se eu converter o arquivo .mkv com um comando como este:

ffmpeg -i Input.FLAC.6.1.mkv -c:s copy -c:v copy -c:a ac3 Output.AC3.6.1.mkv

Então eu recebo áudio 5.1, ou seja, eu perco o canal central de volta. Por mediainfo :

Audio
ID                           : 2
Format                       : AC-3
Format/Info                  : Audio Coding 3
Mode extension               : CM (complete main)
Format settings, Endianness  : Big
Codec ID                     : A_AC3
Duration                     : 2mn 29s
Bit rate mode                : Constant
Bit rate                     : 448 Kbps
Channel(s)                   : 6 channels
Channel positions            : Front: L C R, Side: L R, LFE
Sampling rate                : 48.0 KHz
Bit depth                    : 16 bits
Compression mode             : Lossy
Delay relative to video      : 9ms
Stream size                  : 8.00 MiB (9%)
Writing library              : Lavc57.107.100 ac3
Language                     : English
Default                      : Yes
Forced                       : No
DURATION                     : 00:02:29.768000000
NUMBER_OF_FRAMES             : 1755
NUMBER_OF_BYTES              : 56974307
_STATISTICS_WRITING_APP      : mkvmerge v8.2.0 ('World of Adventure') 64bit
_STATISTICS_WRITING_DATE_UTC : 2015-08-01 13:29:10
_STATISTICS_TAGS             : BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES

Observe como isso mudou:

Channel(s)               : 7 channels
Channel positions        : Front: L C R, Side: L R, Back: C, LFE 

Para:

Channel(s)                   : 6 channels
Channel positions            : Front: L C R, Side: L R, LFE

Se eu tentar forçar o número de canais com -ac 7 , obtenho:

[ac3 @ 0x43f2a40] Specified channel layout '6.1' is not supported

Tentar converter para DTS tem o mesmo resultado exato. Ou seja substituindo:

-c:a ac3

Com:

-strict experimental -c:a dts

Resultados em mediainfo de:

Audio
ID                            : 2
Format                        : DTS
Format/Info                   : Digital Theater Systems
Mode                          : 16
Format settings, Endianness   : Big
Codec ID                      : A_DTS
Duration                      : 2mn 29s
Bit rate mode                 : Constant 
Bit rate                      : 1 413 Kbps 
Channel(s)                    : 6 channels 
Channel positions             : Front: L C R, Side: L R, LFE
Sampling rate                 : 48.0 KHz 
Bit depth                     : 16 bits
Compression mode              : Lossy
Delay relative to video       : 14ms
Stream size                   : 25.2 MiB (23%)
Writing library               : Lavc57.107.100 dca
Language                      : English
Default                       : Yes
Forced                        : No
DURATION                      : 00:02:29.774000000
NUMBER_OF_FRAMES              : 1755
NUMBER_OF_BYTES               : 56974307 
_STATISTICS_WRITING_APP       : mkvmerge v8.2.0 ('World of Adventure') 64bit
_STATISTICS_WRITING_DATE_UTC  : 2015-08-01 13:29:10
_STATISTICS_TAGS              : BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES

E tentar forçar o 6.1 com -ac 7 causa o mesmo erro '6.1' is not supported como acima.

Para o que vale a pena, o ffmpeg usado nos testes acima foi:

$ ffmpeg -version
ffmpeg version 3.4.1-static https://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2017 the FFmpeg developers
built with gcc 6.4.0 (Debian 6.4.0-10) 20171112
configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-6 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gray --enable-libfribidi --enable-libass --enable-libvmaf --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-librtmp --enable-libsoxr --enable-libspeex --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg
libavutil      55. 78.100 / 55. 78.100
libavcodec     57.107.100 / 57.107.100
libavformat    57. 83.100 / 57. 83.100
libavdevice    57. 10.100 / 57. 10.100
libavfilter     6.107.100 /  6.107.100
libswscale      4.  8.100 /  4.  8.100
libswresample   2.  9.100 /  2.  9.100
libpostproc    54.  7.100 / 54.  7.100

Então, como posso converter o áudio no arquivo .mkv para um formato suportado pelo meu sistema, preservando o formato do canal 6.1?

    
por LeoRochael 25.12.2017 / 03:46

2 respostas

1

Resposta parcial (não testada):

Assim, o principal problema parece ser que você está preso a uma conexão S / PDIF óptica / coaxial por algum motivo, que não tem largura de banda suficiente (na verdade, como você diz, nem sequer tem largura de banda suficiente para mais de dois canais de áudio não compactados, a variante 5.1 já está compactada).

Posso confirmar que ffmpeg não suporta a codificação de mais de 6 canais, analisando o código para DTS ou AC3 . Se ffmpeg não suporta, acho que não existem ferramentas prontas para Linux que o suportem.

Analisando como DTS-ES e Dolby Digital EX trabalho, pode-se ver que todos eles não oferecem um canal independente adicional, mas sim mix (ou "matriz") o canal do centro de trás para os outros canais de alguma forma, e definir um sinalizador especial para o modo 6.1 no fluxo de dados digitais. O codificador então tem que separar os canais novamente, o que (por causa da perda de informações) nem sempre é possível, e pode levar a artefatos de som, dependendo do material de origem.

(A possível exceção é "DTS-ES Discrete 6.1", que afirma ter um canal real separado além da codificação da matriz, mas não está claro como este canal é codificado, e como Supõe-se que ele se ajuste à largura de banda S / PDIF limitada, se transportado via S / PDIF, portanto, é bastante provável que a separação exista apenas no material de origem e seja perdida no S / PDIF, de qualquer forma).

Portanto, há dois problemas: como ativar o sinalizador 6.1 no fluxo de dados e como misturar o canal extra nos canais existentes. Felizmente, o seu Sony STR-DE895 parece ter um modo SB DEC [MATRIX] ( manual página 32), que ignora o sinalizador e sempre aplica a matriz do decodificador Dolby Digital EX, independentemente do sinalizador. Assim, isso resolve o primeiro problema sem ter que modificar, e. ffmpeg código-fonte.

Não consegui encontrar informações exatas sobre os coeficientes dessa matriz, mas como ela é "semelhante à prática do formato Pro-Logic anterior da Dolby", que simplesmente adiciona o canal central à esquerda e à direita após diminuí-la por 3 dB (fator 0,5), na primeira aproximação eu tentaria o mesmo para os canais anteriores usando o ffmpeg pan filter, codifique isso como ac3 e veja se o resultado é aceitável.

Supondo que isso funcione, uma solução a longo prazo seria cortar o plugin ALSA A52 para suportar esse tipo de mixagem internamente, assim você teria um verdadeiro dispositivo ALSA de 6.1 canais. Você pode usar isso para reproduzir uma fonte 6.1 em qualquer formato, sem ter que passar pelas contorções de recodificação do material de origem.

Outra abordagem completamente diferente (e eu recomendo tentar isso, e fazer uma comparação de escuta para ter uma ideia sobre a diferença de qualidade e possível presença de artefatos de som) é usar o campo Multi Ch In 1 no a Sony, junto com uma boa placa de som 7.1 analógica (se você tiver uma, ou pode emprestar uma). Isso fornecerá a verdadeira separação de canais, mas, é claro, agora usará os conversores D / A da placa de som, e não da Sony.

    
por 28.12.2017 / 09:18
1

Como o seu amplificador suporta PCM, use isso.

ffmpeg -i Input.FLAC.6.1.mkv -c:s copy -c:v copy -c:a pcm_s16le  Output.PCM.6.1.mkv
    
por 25.12.2017 / 05:47

Tags