ffmpeg 视频转换

ffmpeg 视频转换

无损转换格式,修改默认音轨和字幕轨道

有如下视频

ffmpeg -i input.mkv
Input #0, matroska,webm, from 'input.mkv':
  Metadata:
    ENCODER         : Lavf58.45.100
  Duration: 00:41:40.73, start: 0.000000, bitrate: 1162 kb/s
    Stream #0:0: Video: h264 (High), yuv420p(progressive), 704x512, SAR 1:1 DAR 11:8, 29.97 fps, 29.97 tbr, 1k tbn, 59.94 tbc (default)
    Metadata:
      DURATION        : 00:41:40.731000000
    Stream #0:1(chi): Subtitle: dvd_subtitle, 720x480 (default)
    Metadata:
      DURATION        : 00:39:42.913000000
    Stream #0:2(chi): Subtitle: dvd_subtitle, 720x480
    Metadata:
      DURATION        : 00:39:42.913000000
    Stream #0:3(eng): Subtitle: dvd_subtitle, 720x480
    Metadata:
      DURATION        : 00:39:44.275000000
    Stream #0:4: Audio: aac (LC), 44100 Hz, stereo, fltp (default)
    Metadata:
      DURATION        : 00:41:40.092000000
    Stream #0:5: Audio: aac (LC), 44100 Hz, stereo, fltp
    Metadata:
      DURATION        : 00:41:40.138000000

该视频有六个流

    Stream #0:0: Video: h264 (High), yuv420p(progressive), 704x512, SAR 1:1 DAR 11:8, 29.97 fps, 29.97 tbr, 1k tbn, 59.94 tbc (default)
    Stream #0:1(chi): Subtitle: dvd_subtitle, 720x480 (default)
    Stream #0:2(chi): Subtitle: dvd_subtitle, 720x480
    Stream #0:3(eng): Subtitle: dvd_subtitle, 720x480
    Stream #0:4: Audio: aac (LC), 44100 Hz, stereo, fltp (default)
    Stream #0:5: Audio: aac (LC), 44100 Hz, stereo, fltp

Stream #0:0 其中表示第1个输入文件的第1个流。该流是h264视频。并且是默认视频流。

Stream #0:1 表示表示第1个输入文件的第2个流。该流是中文字幕(chi)。并且是默认字幕。

Stream #0:2 表示表示第1个输入文件的第3个流。该流是中文字幕(chi)。

Stream #0:3 表示表示第1个输入文件的第4个流。该流是英文字幕(eng)。

Stream #0:4 表示表示第1个输入文件的第5个流。该流是音频。并且是默认音频。

Stream #0:5 表示表示第1个输入文件的第6个流。该流是音频。

Stream后面的#号由两个数字组成。第一个数字表示第几个输入文件。从0开始计数。第二个数字表示输入文件的流编号。从0开始计数。

我们可以运行如下命令将视频无损快速的切换默认字幕和音频。

ffmpeg -i input.mkv -map 0:0 -map 0:2 -map 0:1 -map 0:3 -map 0:5 -map 0:4 -c copy -disposition:a:0 default -disposition:s:0 default -y output.mkv

解释:

ffmpeg -i input.mkv ffmpeg 命令并指定输入文件为 input.mkv

-map 0:0 这是第1个出现的 -map ,该命令将第1个输入文件的第1个流(Stream #0:0),输出到output.mkv的第1个流。

-map 0:2 这是第2个出现的 -map ,该命令将第1个输入文件的第3个流(Stream #0:2),输出到output.mkv的第2个流。

-map 0:1 这是第3个出现的 -map ,该命令将第1个输入文件的第2个流(Stream #0:1),输出到output.mkv的第3个流。

-map 0:3 这是第4个出现的 -map ,该命令将第1个输入文件的第4个流(Stream #0:3),输出到output.mkv的第4个流。

-map 0:5 这是第5个出现的 -map ,该命令将第1个输入文件的第6个流(Stream #0:5),输出到output.mkv的第5个流。

-map 0:4 这是第6个出现的 -map ,该命令将第1个输入文件的第5个流(Stream #0:4),输出到output.mkv的第6个流。

-c copy 直接拷贝输入流,不进行任何处理和转换。

-disposition:a:0 default 将默认音频流设置成第一个音轨。

-disposition:s:0 default 将默认字幕流设置成第一个字幕。

-y 如果已存在输出文件,直接覆盖输出文件。

output.mkv 输出文件名路径。

如此我们便将输入文件流的第2和第3对掉。将第5和第6对掉。并将默认音频流设置成第一个音轨,默认字幕流设置成第一个字幕。

Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:2 -> #0:1 (copy)
  Stream #0:1 -> #0:2 (copy)
  Stream #0:3 -> #0:3 (copy)
  Stream #0:5 -> #0:4 (copy)
  Stream #0:4 -> #0:5 (copy)

批量转换:

for file in *.mkv
do
ffmpeg -i "$file" -map 0:0 -map 0:2 -map 0:1 -map 0:3 -map 0:5 -map 0:4 -c copy -disposition:a:0 default -disposition:s:0 default "converted-$file"
done