將 MKV 內的音頻轉換為 AC3 或 DTS,保留 6.1 聲道
我有一些
.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 -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 版本已經壓縮)。
我可以通過查看DTS或AC3的程式碼來確認
ffmpeg
不支持對超過 6 個通道進行編碼。如果不支持它,我的猜測是沒有現成的 Linux 工具支持它。ffmpeg
看看DTS-ES和Dolby 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 轉換器,而不是索尼的。