【问题标题】:ffmpeg : how to extract 1st video, english audio and french subtitle from video file in one command line?ffmpeg:如何在一个命令行中从视频文件中提取第一个视频、英文音频和法文字幕?
【发布时间】:2020-05-13 18:56:50
【问题描述】:

我已经阅读了许多与使用 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所有法语或英语的音频和字幕轨道。

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

谢谢。

【问题讨论】:

  • 您好,我添加了新答案,您尝试过我的建议了吗?
  • MichalH 谢谢大家。阅读您的建议再次教会了我一些 ffmpeg 的精妙之处。我选择了单行答案,但我从两者中都学到了。

标签: ffmpeg


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-24
      • 2015-12-31
      • 2012-12-06
      • 2012-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多