我想将文件 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
可以使用 FFmpeg
map
和disposition
选项来完成音频流的排序。最好的语法可以说是:稍微解压一下:
-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
选项的指南disposition
选项。我通过向谷歌询问一个高度相关但略有不同的问题找到了这个帖子——我现在有了答案。因此,与我有相同问题的其他人也可能会在这里结束,这可能会在某个时候帮助其他人。
我们的“智能”电视集成了 Mp4 播放器,可以播放 MP3 或 AAC 音轨。我有一堆(大约 80 个)具有 AAC 配乐的文件 - 但这些文件以非常低的音量播放(电视音量设置为 100% 远不足以听到很多对话)。由于房子里有听力问题且没有嵌入式潜艇的老人,这使得上述视频无法观看。
所以,我想要一种使用 ffmpeg 的方法:
保留原 AAC 的同时,还添加了源自 AAC 的 MP3 音轨,但经过响度处理,适合看电视。
将 AAC 音轨降级为第二个音频流,同时将新的 MP3 音频设为默认。在实验过程中,我发现这个特定的电视播放器(松下)总是默认为第一个音频流——无论哪个被标记为默认值。
作为锦上添花,我想给每个音频流一个适当的元数据标题。
我本可以对现有的流进行解复用,然后创建新处理的音频,然后将它们全部重新混合,但我确信 ffmpeg 可以作为一个命令行来执行此操作 - 当您有 80 个文件时,这可以实现更整洁和更快的进度去做。ffmpeg 没有让我失望。
在上面的答案和我发现的其他东西的帮助下,这是我最终得到的命令行 - 很有效。
在这个命令中:
-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 永远不会给人留下深刻印象 - 总是一种做你想做的事的方法。HTH 其他人的某个时候。