无损转换格式,修改默认音轨和字幕轨道
有如下视频
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