ffmpeg 编辑 avi 元数据和音轨命名

Dav*_*log 5 audio video metadata ffmpeg

我的磁盘上有一堆 avi 格式的电影。但是,它们不包含任何元数据,如标题等。

我找到了一个可以为我做的命令:

ffmpeg -i input.avi -metadata title="Moonshine" -metadata author="Moonshine" -metadata copyright="2009" -metadata comment="foo" -acodec copy -vcodec copy output.avi
Run Code Online (Sandbox Code Playgroud)

这工作正常,但它只会复制一个音轨。我的文件包含多个音轨。我希望 ffmpeg 复制所有内容并只给文件一个标题。

另外,有没有办法给音轨一个语言名称?例如,一个文件包含 2 个音轨。第一个是英语,第二个是俄语。如何正确命名它们,以便当我使用视频播放器时,它会在语言菜单中显示第一个是英语,第二个是俄语?

llo*_*gan 6

流选择

默认流选择行为是为每个输入选择一种流类型。例如,在您的输入中,如果它包含两个音频流,则只会选择通道数最多的流。

您可以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
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅文档


小智 5

我花了很长时间才弄清楚这一点。我在这里发布它,因为即使在 3 年后这个线程也是谷歌搜索中的第一个热门话题之一:AVI(更具体地说:RIFF)确实支持语言名称,但与 mkv 相反,元数据没有存储在流中,但是在标头中使用标签 IAS1-9 最多可用于 9 个不同的音频流。

ffmpeg -i input.avi -map 0 -codec copy -metadata IAS1=eng -metadata IAS2=ger output.avi
Run Code Online (Sandbox Code Playgroud)

VLC 非常宽容。如果您输入 ISO 代码“ger”,VLC 会将其转换为“Deutsch”,如果您输入“MyLang”,VLC 将显示“MyLang”。Kodi 等其他软件需要正确的 ISO 代码。它只会读取“MyL”,然后将语言显示为未知。

但是,请注意 ffmpeg 不仅会添加语言,还会更改其他元数据。例如,output.avi 中的音频交错和预加载数据是不同的,不知道这是否好或可能导致音频不同步。请与 MediaInfo 或类似机构核对。