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

Shr*_*tre 12 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
Run Code Online (Sandbox Code Playgroud)

and*_*.46 19

音频流的排序可以使用 FFmpegmapdisposition选项来完成。最好的语法可以说是:

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
Run Code Online (Sandbox Code Playgroud)

稍微解开一下这个:

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

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

笔记...

  • 如果其中一个流已经是默认值并且您要更改它,您还需要添加“-disposition:a:N 0”,其中 N 是旧的默认值。配置的工作方式是,您没有设置*默认*默认值,您只是向音频流添加一个“默认”标志。因此,您还需要从旧流中“删除”“默认”标志。否则,您将有两个流标记为默认,并且您可能无法获得所需的结果,具体取决于您的播放器。 (3认同)