![将 MKV 内的音频转换为 AC3 或 DTS,保留 6.1 声道](https://linux22.com/image/124275/%E5%B0%86%20MKV%20%E5%86%85%E7%9A%84%E9%9F%B3%E9%A2%91%E8%BD%AC%E6%8D%A2%E4%B8%BA%20AC3%20%E6%88%96%20DTS%EF%BC%8C%E4%BF%9D%E7%95%99%206.1%20%E5%A3%B0%E9%81%93.png)
我有一些.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 放大器(索尼STR-DE895,如果有人关心的话)通过 S/PDIF(光纤和同轴电缆)连接接受以下格式的数字音频:
- PCM(S/PDIF 上仅限 2 个通道)
- 数码传输 (5.1)
- DTS-ES (6.1)
- 新6 (6.1)
- 杜比数字 (5.1)
- 数字-EX (6.1)
- 专业逻辑II
我想让这些.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 声道格式呢?
答案1
部分答案(未经测试):
因此,主要问题似乎是您由于某种原因而陷入光纤/同轴 S/PDIF 连接的困境,该连接没有足够的带宽(实际上,正如您所说,它甚至没有足够的带宽来进行超过两个未压缩的音频通道;5.1 版本已压缩)。
我可以ffmpeg
通过查看代码来确认不支持编码超过 6 个通道数字传输系统或者交流3。如果ffmpeg
不支持它,我的猜测是 Linux 上不存在支持它的现成工具。
看看如何DTS-ES和杜比数字 EX工作时,我们可以看到它们都不会为您提供额外的独立通道,而是以某种方式将后中心通道混合(或“矩阵”)到其他通道上,并为 6.1 模式设置一个特殊标志数字数据流。然后,编码器必须再次分离通道,这(由于信息丢失)并不总是可能的,并且可能导致声音伪影,具体取决于源材料。
(可能的例外是“DTS-ES Discrete 6.1”,它声称拥有真正的独立通道此外到矩阵编码,但不清楚该通道是如何编码的,以及如果通过 S/PDIF 传输,它应该如何适应有限的 S/PDIF 带宽,因此很可能这种分离只存在于源材料中,并且无论如何,在 S/PDIF 上会丢失)。
因此存在两个问题:如何在数据流中启用6.1标志,以及如何将额外的通道混合到现有通道上。幸运的是,您的 Sony STR-DE895 似乎有一个SB DEC [MATRIX]
模式(手动的第 32 页),它忽略该标志并始终应用 Dolby Digital EX 解码器矩阵,而不管标志如何。这样就解决了第一个问题,而无需修改例如ffmpeg
源代码。
我无法找到有关该矩阵系数的确切信息,但因为它“实际上类似于杜比早期的定向逻辑格式”,它只是在将中央声道减少 3 dB(因子0.5),在第一个近似值中,我会使用以下方法对反向通道进行相同的尝试ffmpeg
平底锅过滤,将其编码为ac3
,然后查看结果是否可接受。
假设这可行,一个长期的解决方案是破解 ALSA A52 插件以支持这种内部混合,这样您就拥有了真正的 6.1 通道 ALSA 设备。然后,您可以使用它来播放任何格式的 6.1 源,而无需对源材料进行重新编码。
另一种完全不同的方法(我建议尝试这个,并进行聆听比较,以了解质量差异以及可能存在的声音伪影)是使用Multi Ch In 1
索尼上的场,以及好的模拟7.1 声卡(如果您有一张,或者可以借一张)。这将提供真正的通道分离,但当然现在将使用声卡的 D/A 转换器,而不是索尼的。
答案2
由于您的放大器支持 PCM,因此请使用它。
ffmpeg -i Input.FLAC.6.1.mkv -c:s copy -c:v copy -c:a pcm_s16le Output.PCM.6.1.mkv