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 -scodec copy -f matroska "${file%.*}.mkv_out"

file.mkv_out所有法语或英语的音频和字幕轨道。

有没有办法做到这一点,而无需事先了解原始文件中的曲目编号?

谢谢。

使用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 -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"

然后,从这个文件中获取第一个流(视频(、第二个流(第一个英语音频(和所有字幕(所有法语(:

ffmpeg -i "${file%.*}.mkv_out_tmp" -map 0:0 -map 0:1 -map 0:s -c copy -f matroska "${file%.*}.mkv_out"

最后,删除临时文件:

rm "${file%.*}.mkv_out_tmp"

相关内容

  • 没有找到相关文章

最新更新