我已经阅读了许多与使用 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"