如何使用 FFmpeg 更改默认音轨?

如何使用 FFmpeg 更改默认音轨?

我想将文件 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:这将我们所需的音频流(英语)设置为默认. 如果已在另一个输入音频流上设置此项,则很有用。

这在我的系统上生成的测试文件上运行良好,并且应该也在你的系统上运行良好......

笔记...

答案2

我在 Google 上问了一个高度相关但略有不同的问题,找到了这个帖子 - 现在我知道了答案。所以可能遇到和我一样问题的人也会来这里,这可能会在某个时候帮助到别人。

我们的“智能”电视配有内置 Mp4 播放器,可以播放 MP3 或 AAC 音轨。我有很多(约 80 个)带有 AAC 音轨的文件 - 但这些文件播放时的音量非常低(电视音量设置为 100% 根本听不到大部分对话)。由于家里有听力有问题的老人,而且没有内置低音炮,因此无法观看上述视频。

所以,我想要一种使用 ffmpeg 的方法来:

  1. 保留原始的 AAC,同时添加源自 AAC 的 MP3 音轨,但经过响度处理,以适合观看电视。

  2. 将 AAC 音轨降级为第二个音频流,同时将新的 MP3 音频设为默认。在实验过程中,我发现这款特定的电视播放器(松下)始终默认为第一个音频流 - 无论哪个被标记为默认。

  3. 锦上添花的是,我想给每个音频流一个适当的元数据标题。

可以刚刚对现有流进行了解复用,然后创建了新的处理后的音频,然后再次将它们全部混合起来,但我确信 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 永远不会让人失望 - 总有办法做你想做的事。有时间可以和别人一起玩。

相关内容