ffmpeg:如何在一个命令行中从视频文件中提取第一个视频、英语音频和法语字幕?

ffmpeg:如何在一个命令行中从视频文件中提取第一个视频、英语音频和法语字幕?,ffmpeg,Ffmpeg,我读过很多关于使用ffmpeg提取每种语言的流的文章,但是似乎-map 0:m:language:xxx是全局的,适用于所有流 假设我有一个视频文件,其中可能包含一个英语音频流和一些法语字幕流,以及许多其他流。我想得到一个更小的文件,第一个视频曲目,第一个英语音频流和所有法语字幕流 如果我跑 ffmpeg -i "$file" -map 0:v:0 -vcodec copy -map 0:m:language:eng -acodec copy -map 0:m:language:fre -sco

我读过很多关于使用ffmpeg提取每种语言的流的文章,但是似乎-map 0:m:language:xxx是全局的,适用于所有流

假设我有一个视频文件,其中可能包含一个英语音频流和一些法语字幕流,以及许多其他流。我想得到一个更小的文件,第一个视频曲目,第一个英语音频流和所有法语字幕流

如果我跑

ffmpeg -i "$file" -map 0:v:0 -vcodec copy -map 0:m:language:eng -acodec copy -map 0:m:language:fre -scodec copy -f matroska "${file%.*}.mkv_out"
我在file.mkv_中输入所有法语或英语的音频和字幕曲目

有没有办法做到这一点,而不必事先知道原始文件中的曲目编号


谢谢。

由于第一个英语音频流的要求,恐怕不能在一个命令中完成。但是,您可以先提取所有英语音频流,然后在第二个命令中选择第一个,如下所示:

将第一个视频、所有英语音频流、所有法语字幕流提取到临时文件:

ffmpeg -i "$file" -map 0:v:0 -map 0:a:m:language:eng -map 0:s:m:language:fre -c copy -f matroska "${file%.*}.mkv_out_tmp"
rm "${file%.*}.mkv_out_tmp"
然后,从该文件中获取第一个流视频,第二个流第一个英语音频,所有字幕均为法语:

ffmpeg -i "${file%.*}.mkv_out_tmp" -map 0:0 -map 0:1 -map 0:s -c copy -f matroska "${file%.*}.mkv_out"
最后,删除临时文件:

ffmpeg -i "$file" -map 0:v:0 -map 0:a:m:language:eng -map 0:s:m:language:fre -c copy -f matroska "${file%.*}.mkv_out_tmp"
rm "${file%.*}.mkv_out_tmp"

由于第一个英语音频流的要求,恐怕这不能在一个命令中完成。但是,您可以先提取所有英语音频流,然后在第二个命令中选择第一个,如下所示:

将第一个视频、所有英语音频流、所有法语字幕流提取到临时文件:

ffmpeg -i "$file" -map 0:v:0 -map 0:a:m:language:eng -map 0:s:m:language:fre -c copy -f matroska "${file%.*}.mkv_out_tmp"
rm "${file%.*}.mkv_out_tmp"
然后,从该文件中获取第一个流视频,第二个流第一个英语音频,所有字幕均为法语:

ffmpeg -i "${file%.*}.mkv_out_tmp" -map 0:0 -map 0:1 -map 0:s -c copy -f matroska "${file%.*}.mkv_out"
最后,删除临时文件:

ffmpeg -i "$file" -map 0:v:0 -map 0:a:m:language:eng -map 0:s:m:language:fre -c copy -f matroska "${file%.*}.mkv_out_tmp"
rm "${file%.*}.mkv_out_tmp"
使用ffmpeg通过管道传输到另一个ffmpeg以避免临时文件:

ffmpeg -i input.mkv -map 0:v:0 -map 0:a:m:language:eng -map 0:s:m:language:fre -c copy -f matroska - | ffmpeg -i - -map 0:v -map 0:a:0 -map 0:s -c copy output.mkv
使用ffmpeg通过管道传输到另一个ffmpeg以避免临时文件:

ffmpeg -i input.mkv -map 0:v:0 -map 0:a:m:language:eng -map 0:s:m:language:fre -c copy -f matroska - | ffmpeg -i - -map 0:v -map 0:a:0 -map 0:s -c copy output.mkv

您好,我添加了新的答案,您尝试了我的建议吗?迈克尔谢谢大家。读了你的建议,我又学到了一些细节。我选择了一行的答案,但我从两个方面都学到了。你好,我添加了新的答案,你尝试了我的建议吗?迈克尔谢谢大家。读了你的建议,我又学到了一些细节。我选择了一行的答案,但我从两个方面都学到了东西。