Tenho alguns .mkv
arquivos que contém áudio 6.1 no formato FLAC. mediainfo
relata 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 amplificador "Home Theater" 6.1 (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 LÓGICA II
Eu gostaria de ter esses .mkv
arquivos dirigindo todos os alto-falantes 6.1 do amplificador, mas se eu converter o .mkv
arquivo 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, perco o canal traseiro central. 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 mudou de:
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 -ac 7
, recebo:
[ac3 @ 0x43f2a40] Specified channel layout '6.1' is not supported
Tentar converter para DTS
tem exatamente o mesmo resultado. Ou seja, substituindo:
-c:a ac3
Com:
-strict experimental -c:a dts
Resultados em um 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 6.1 -ac 7
causa o mesmo '6.1' is not supported
erro acima.
Por 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 do .mkv
arquivo para um formato suportado pelo meu sistema, preservando o formato de canal 6.1?
Como seu amplificador suporta PCM, use-o.
Resposta parcial (não testada):
Portanto, o principal problema parece ser que você está preso a uma conexão óptica/coaxial S/PDIF por algum motivo, que não possui largura de banda suficiente (na verdade, como você disse, nem mesmo possui 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, observando o código para DTS ou AC3 . Seffmpeg
não for compatível, meu palpite é que não existem ferramentas prontas para Linux que o suportem.Observando como o DTS-ES e o Dolby Digital EX funcionam, pode-se ver que todos eles também não oferecem um canal independente adicional, mas misturam (ou "matrizam") o canal traseiro central nos outros canais de alguma forma , e defina um sinalizador especial para o modo 6.1 no fluxo de dados digitais. O codificador então precisa separar os canais novamente, o que (devido à 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 esse canal é codificado e como ele deve se ajustar ao S/PDIF limitado largura de banda se transportada via S/PDIF, então é bem provável que a separação só exista no material de origem e seja perdida em S/PDIF, de qualquer maneira).
Portanto, existem dois problemas: como habilitar o sinalizador 6.1 no fluxo de dados e como misturar o canal extra nos canais existentes. Felizmente, seu Sony STR-DE895 parece ter um
SB DEC [MATRIX]
modo ( manual página 32), que ignora o sinalizador e sempre aplica a matriz do decodificador Dolby Digital EX independentemente do sinalizador. Isso resolve o primeiro problema sem ter que modificar, por exemploffmpeg
, o código-fonte.Não consegui encontrar informações exatas sobre os coeficientes dessa matriz, mas como ela é "semelhante na prática ao formato Pro-Logic anterior da Dolby", que simplesmente adiciona o canal central à esquerda e à direita depois de diminuí-lo em 3 dB (fator 0.5), em primeira aproximação eu tentaria o mesmo para os canais traseiros usando o filtro
ffmpeg
pan , codificaria isso comoac3
, e veria se o resultado é aceitável.Supondo que isso funcione, uma solução de longo prazo seria hackear o plug-in ALSA A52 para suportar esse tipo de mixagem internamente, para que você tenha 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 recodificar o material de origem.
Outra abordagem completamente diferente (e eu recomendo tentar isso e fazer uma comparação de audição para ter uma ideia sobre a diferença de qualidade e a possível presença de artefatos de som) é usar seu
Multi Ch In 1
campo na Sony, junto com um boa placa de som analógica 7.1 (se você tiver uma, ou pode emprestar uma). Isso fornecerá uma verdadeira separação de canais, mas é claro que agora usará os conversores D/A da placa de som e não da Sony.