我想将文件 input.mkv 中的默认音轨从葡萄牙语更改为英语。
该视频包含 4 个音轨:葡萄牙语(默认)、西班牙语、英语和日语。我还想保留字幕。
视频相关信息如下:
Input #0, matroska,webm, from 'input.mkv':
Metadata:
encoder : libebml v1.3.10 + libmatroska v1.5.2
creation_time : 2021-01-24T22:56:10.000000Z
Duration: 00:26:36.85, start: -0.007000, bitrate: 2157 kb/s
Stream #0:0: Video: hevc (Main 10), yuv420p10le(tv), 1920x1080, SAR 1:1 DAR 16:9, 23.98 fps, 23.98 tbr, 1k tbn, 23.98 tbc (default)
Metadata:
BPS-eng : 1880412
DURATION-eng : 00:24:21.134000000
NUMBER_OF_FRAMES-eng: 35032
NUMBER_OF_BYTES-eng: 343441847
_STATISTICS_WRITING_APP-eng: mkvmerge v45.0.0 ('Heaven') 64-bit
_STATISTICS_WRITING_DATE_UTC-eng: 2021-01-24 22:56:10
_STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
Stream #0:1(por): Audio: opus, 48000 Hz, stereo, fltp (default)
Metadata:
ENCODER : Lavc58.97.100 libopus
BPS-eng : 116334
DURATION-eng : 00:24:21.639000000
NUMBER_OF_FRAMES-eng: 73082
NUMBER_OF_BYTES-eng: 21254949
_STATISTICS_WRITING_APP-eng: mkvmerge v45.0.0 ('Heaven') 64-bit
_STATISTICS_WRITING_DATE_UTC-eng: 2021-01-24 22:56:10
_STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
Stream #0:2(spa): Audio: opus, 48000 Hz, stereo, fltp
Metadata:
ENCODER : Lavf55.33.100
BPS-eng : 121447
DURATION-eng : 00:26:36.843000000
NUMBER_OF_FRAMES-eng: 79843
NUMBER_OF_BYTES-eng: 24241492
_STATISTICS_WRITING_APP-eng: mkvmerge v45.0.0 ('Heaven') 64-bit
_STATISTICS_WRITING_DATE_UTC-eng: 2021-01-24 22:56:10
_STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
Stream #0:3(eng): Audio: opus, 48000 Hz, stereo, fltp
Metadata:
BPS-eng : 103565
DURATION-eng : 00:24:21.049000000
NUMBER_OF_FRAMES-eng: 73053
NUMBER_OF_BYTES-eng: 18914357
_STATISTICS_WRITING_APP-eng: mkvmerge v45.0.0 ('Heaven') 64-bit
_STATISTICS_WRITING_DATE_UTC-eng: 2021-01-24 22:56:10
_STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
Stream #0:4(jpn): Audio: opus, 48000 Hz, stereo, fltp
Metadata:
BPS-eng : 104161
DURATION-eng : 00:24:21.138000000
NUMBER_OF_FRAMES-eng: 73057
NUMBER_OF_BYTES-eng: 19024328
_STATISTICS_WRITING_APP-eng: mkvmerge v45.0.0 ('Heaven') 64-bit
_STATISTICS_WRITING_DATE_UTC-eng: 2021-01-24 22:56:10
_STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
Stream #0:5(por): Subtitle: ass
Metadata:
BPS-eng : 79
DURATION-eng : 00:23:59.360000000
NUMBER_OF_FRAMES-eng: 245
NUMBER_OF_BYTES-eng: 14246
_STATISTICS_WRITING_APP-eng: mkvmerge v45.0.0 ('Heaven') 64-bit
_STATISTICS_WRITING_DATE_UTC-eng: 2021-01-24 22:56:10
_STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
Stream #0:6(spa): Subtitle: ass
Metadata:
BPS-eng : 83
DURATION-eng : 00:23:59.360000000
NUMBER_OF_FRAMES-eng: 242
NUMBER_OF_BYTES-eng: 15096
_STATISTICS_WRITING_APP-eng: mkvmerge v45.0.0 ('Heaven') 64-bit
_STATISTICS_WRITING_DATE_UTC-eng: 2021-01-24 22:56:10
_STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
Stream #0:7(eng): Subtitle: ass
Metadata:
title : (Forced)
BPS-eng : 435
DURATION-eng : 00:23:05.930000000
NUMBER_OF_FRAMES-eng: 523
NUMBER_OF_BYTES-eng: 75467
_STATISTICS_WRITING_APP-eng: mkvmerge v45.0.0 ('Heaven') 64-bit
_STATISTICS_WRITING_DATE_UTC-eng: 2021-01-24 22:56:10
_STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
Stream #0:8(eng): Subtitle: ass
Metadata:
BPS-eng : 505
DURATION-eng : 00:23:59.390000000
NUMBER_OF_FRAMES-eng: 775
NUMBER_OF_BYTES-eng: 90904
_STATISTICS_WRITING_APP-eng: mkvmerge v45.0.0 ('Heaven') 64-bit
_STATISTICS_WRITING_DATE_UTC-eng: 2021-01-24 22:56:10
_STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
答案1
map
可以使用 FFmpeg和选项来对音频流进行排序disposition
。最佳语法是可以说:
ffmpeg -i input.mkv -map 0:v:0 \
-map 0:a:2 -map 0:a:0 -map 0:a:1 -map 0:a:3 \
-map 0:s -c copy \
-disposition:a:0 default \
reordered.mkv
稍微解释一下:
-map 0:v:0
:选择第一个(也是唯一一个)视频流-map 0:a:1 -map 0:a:0 -map 0:a:2 -map 0:a:3
:音频流是单独放置的。每个“集合”的最后一位数字从 4 个音频流中选择,其中“0”表示第一个音频流,“3”表示最后一个音频流。当然,英语是第一个指定的,并且是流 2。-map 0:s
:选择所有字幕文件-c copy
:复制视频、音频和字幕流,无需重新编码。-disposition:a:0 default
:这将我们所需的音频流(英语)设置为默认. 如果已在另一个输入音频流上设置此项,则很有用。
这在我的系统上生成的测试文件上运行良好,并且应该也在你的系统上运行良好......
笔记...
- 使用 -map 选项选择流:编写精美的 FFmpeg trac 指南,介绍如何使用 FFmpeg 的
map
选项 - FFmpeg 的主要选项:从此链接向下滚动可查看 FFmpeg
disposition
选项的用法和可用选项。
答案2
我在 Google 上问了一个高度相关但略有不同的问题,找到了这个帖子 - 现在我知道了答案。所以可能遇到和我一样问题的人也会来这里,这可能会在某个时候帮助到别人。
我们的“智能”电视配有内置 Mp4 播放器,可以播放 MP3 或 AAC 音轨。我有很多(约 80 个)带有 AAC 音轨的文件 - 但这些文件播放时的音量非常低(电视音量设置为 100% 根本听不到大部分对话)。由于家里有听力有问题的老人,而且没有内置低音炮,因此无法观看上述视频。
所以,我想要一种使用 ffmpeg 的方法来:
保留原始的 AAC,同时添加源自 AAC 的 MP3 音轨,但经过响度处理,以适合观看电视。
将 AAC 音轨降级为第二个音频流,同时将新的 MP3 音频设为默认。在实验过程中,我发现这款特定的电视播放器(松下)始终默认为第一个音频流 - 无论哪个被标记为默认。
锦上添花的是,我想给每个音频流一个适当的元数据标题。
我可以刚刚对现有流进行了解复用,然后创建了新的处理后的音频,然后再次将它们全部混合起来,但我确信 ffmpeg 可以在一个命令行中完成此操作 - 当您有 80 个文件要处理时,这可以使进度更加整洁和更快。ffmpeg 没有让我失望。
借助上述答案和我发现的其他东西,这是我最终得到的命令行——效果很好。
ffmpeg -i intest.mp4 -map 0 -disposition:a:0 0 -c:v copy -c:a:0 libmp3lame -metadata:s:a:0 title="MP3-LoudnessProcessed" -metadata:s:a:1 title="OriginalAAC" -filter:a loudnorm -disposition:a:0 default -map 0:a:0 -disposition:a:1 0 outtest.mp4
在此命令中:
-map 0
表示选择所有流-disposition:a:0 0
意思是,忘记第一个音频流是默认音频流-c:v copy
– 表示按原样传输视频流-c:a:0 libmp3lame -metadata:s:a:0 title="mp3-LoudnessProcessed" -filter:a loudnorm -disposition:a:0 default
表示将新的 MP3 音频流作为流 0,并将其命名为“Mp3”,并对该流进行响度标准化,并将其设为默认音频-map 0:a:0
表示从输入文件中映射第一个现有的 AAC 音频流。由于这是最后发生的,因此它最终成为第二个音频流(流 1)。有些播放器总是默认使用第一个音频流(流 0)——无论哪个被标记为默认音频,所以我需要确保 AAC 流是最后一个。-disposition:a:1 0
- 表示忘记现有音频流(现在是音频流 1)曾经是默认的。这可能实际上不需要(??)但不会造成任何伤害。
ffmpeg 永远不会让人失望 - 总有办法做你想做的事。有时间可以和别人一起玩。