Audio

將 MKV 內的音頻轉換為 AC3 或 DTS,保留 6.1 聲道

  • November 2, 2020

我有一些.mkv包含 FLAC 格式的 6.1 音頻的文件。mediainfo將這些文件中的音軌報告為:

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

我還有一個“家庭影院”6.1 amp(Sony STR-DE895,如果有人關心的話),它通過以下格式的 S/PDIF(光纖和同軸電纜)連接本機接受數字音頻:

  • PCM(在 S/PDIF 上限制為 2 個通道)

  • 數字電視 (5.1)

    • DTS-ES (6.1)
    • NEO6 (6.1)
  • 杜比數字 (5.1)

    • 數字-EX (6.1)
    • 專業邏輯二

我想讓這些.mkv文件從放大器驅動所有 6.1 揚聲器,但如果我.mkv使用如下命令轉換文件:

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

然後我得到 5.1 音頻,即我失去了中央後置聲道。每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

注意它是如何變化的:

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

到:

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

如果我嘗試強制使用-ac 7我得到的頻道數量:

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

嘗試轉換為DTS具有完全相同的結果。即替換:

-c:a ac3

和:

-strict experimental -c:a dts

結果mediainfo

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

並嘗試強制 6.1-ac 7導致與上述相同的'6.1' is not supported錯誤。

值得一提的是,上面測試ffmpeg使用的是:

$ 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

那麼,如何將.mkv文件中的音頻轉換為系統支持的格式,同時保留 6.1 聲道格式?

部分答案(未經測試):

因此,主要問題似乎是由於某種原因您被光纖/同軸電纜 S/PDIF 連接卡住了,它沒有足夠的頻寬(實際上,正如您所說,它甚至沒有足夠的頻寬超過兩個未壓縮的音頻通道;5.1 版本已經壓縮)。

我可以通過查看DTSAC3的程式碼來確認ffmpeg不支持對超過 6 個通道進行編碼。如果不支持它,我的猜測是沒有現成的 Linux 工具支持它。ffmpeg

看看DTS-ESDolby Digital EX是如何工作的,可以看到它們都沒有給你額外的獨立通道,而是以某種方式將後中央通道混合(或“矩陣”)到其他通道上,並在數字數據流中為 6.1 模式設置一個特殊標誌。然後編碼器必須再次分離通道,這(因為資訊失去)並不總是可能的,並且可能導致聲音偽影,具體取決於源材料。

(可能的例外是“DTS-ES Discrete 6.1”,它聲稱除了矩陣編碼之外還有一個真正的獨立通道,但不清楚這個通道是如何編碼的,以及它應該如何適應有限的 S/PDIF如果通過 S/PDIF 傳輸頻寬,因此很可能分離僅存在於源材料中,並且無論如何都會在 S/PDIF 上失去)。

因此存在兩個問題:如何在數據流中啟用 6.1 標誌,以及如何將額外的通道混合到現有通道上。幸運的是,您的 Sony STR-DE895 似乎有一個SB DEC [MATRIX]模式(手冊第 32 頁),它忽略標誌並始終應用杜比數字 EX 解碼器矩陣,而不管標誌如何。這樣就解決了第一個問題,而無需修改例如ffmpeg原始碼。

我找不到關於這個矩陣係數的確切資訊,但因為它“在實踐中類似於杜比早期的 Pro-Logic 格式”,它只是在將中央聲道降低 3 dB 後將其添加到左右兩側(因子0.5),在第一個近似值中,我會嘗試使用ffmpeg 平移濾波器對後通道進行相同的處理,將其編碼為ac3,並查看結果是否可以接受。

假設這是可行的,一個長期的解決方案是破解 ALSA A52 外掛以在內部支持這種混合,這樣你就有一個真正的 6.1 通道 ALSA 設備。然後,您可以使用它來播放任何格式的 6.1 源,而不必經歷重新編碼源材料的扭曲。

另一種完全不同的方法(我建議嘗試一下,並進行聽力比較,以了解質量差異以及可能存在的聲音偽影)是Multi Ch In 1在 Sony 上使用您的領域,以及不錯的模擬7.1 音效卡(如果你有,或者可以藉一個)。這將提供真正的通道分離,但當然現在將使用音效卡的 D/A 轉換器,而不是索尼的。

引用自:https://unix.stackexchange.com/questions/412877