我的磁盘上有很多 avi 格式的电影。但是,它们不包含任何元数据,例如标题等。
我找到了一个可以为我做这件事的命令:
ffmpeg -i input.avi -metadata title="Moonshine" -metadata author="Moonshine" -metadata copyright="2009" -metadata comment="foo" -acodec copy -vcodec copy output.avi
这很好用,但是它只能复制一个音轨。我的文件包含多个音轨。我希望 ffmpeg 复制所有内容,然后为文件添加标题。
另外,有没有办法给音轨指定语言名称?例如,一个文件包含 2 个音轨。第一个是英语,第二个是俄语。我该如何正确命名它们,以便当我使用视频播放器时,语言菜单中会显示第一个是英语,第二个是俄语?
答案1
流选择
默认流选择行为是为每个输入选择一个流类型。例如,在您的输入中,如果它包含两个音频流,则只会选择具有最多通道数的流。
您可以使用ffmpeg
这个选项来包含所有流-map
。
因为-map
选项从 开始计数0
,所以0
本例中的 指的是第一个输入(input.avi
:本例中您的唯一输入)。如果您有其他输入,则-map 1
指的是第二个输入。
设置语言元数据
要设置第一和第二个音频流的语言,请使用-metadata
以下选项流说明符:
ffmpeg -i input.avi -map 0 -codec copy -metadata:s:a:0 language=eng -metadata:s:a:1 language=rus output.avi
查看文档了解更多信息。
答案2
我花了很长时间才弄清楚。我在这里发布它,因为即使 3 年后,这个帖子仍然是谷歌搜索中的第一个热门话题:AVI(更具体地说:RIFF)确实支持语言名称,但与 mkv 相反,元数据不是存储在流中,而是存储在标头中,使用标签 IAS1-9 最多可存储 9 个不同的音频流。
ffmpeg -i input.avi -map 0 -codec copy -metadata IAS1=eng -metadata IAS2=ger output.avi
VLC 的容忍度相当高。如果您输入 ISO 代码“ger”,VLC 会将其翻译为“Deutsch”,如果您输入“MyLang”,VLC 会显示“MyLang”。其他软件(如 Kodi)需要正确的 ISO 代码。它只会读取“MyL”,然后将语言显示为未知。
但是,请注意,ffmpeg 不仅添加了语言,还更改了其他元数据。例如,音频交错和预加载数据在 output.avi 中是不同的,不知道这是否是好事,或者可能会导致音频不同步。使用 MediaInfo 或类似工具进行检查。
答案3
对 AVI 文件使用如下方法
-map 0 -acodec copy -metadata:s:a:0 title="English" -metadata:s:a:1 title="Hindi"
标题关键词起到作用