我正在使用 ffmpeg 从视频文件中提取音频流:
ffmpeg -i video.mp4 -vn -acodec copy audio.aac
这将生成一个干净的音频文件,但没有任何元数据。
要添加元数据,ffmpeg 有一个命令行选项:
ffmpeg -i video.mp4 -vn -acodec copy -metadata title="My Title" audio.aac
运行没有错误,但是当用 ffprobe 检查输出文件时,它根本没有元数据标签。
如果将输出容器改为 mp4,则可以设置元数据并出现在输出文件中:
ffmpeg -i video.mp4 -vn -acodec copy -metadata title="My Title" audio.mp4
有趣的是,如果我使用 Banshee 编辑现有 .aac 文件的元数据,然后使用 ffmpeg 以相同方式处理该文件,则原始元数据将成功复制到新的 .aac 文件中。
ffmpeg -i metadata.aac -vn -acodec copy audio.aac
但尝试更改元数据则不会有任何效果:
ffmpeg -i metadata.aac -vn -acodec copy -metadata title="My Title" audio.aac
因此看起来 .aac 容器可以保存元数据并且 ffmpeg 可以将其从输入复制到输出,但是在使用复制编解码器时无法更改它。
有谁知道如何让 ffmpeg 改变 aac 容器中的元数据而无需重新编码?
或者,是否有另一个通用工具可以用来在文件处理后设置元数据?
非常感谢,克里斯。
答案1
目标是从视频文件生成纯音频文件,无需重新编码,并引入媒体播放器可识别的元数据。环境是 Debian GNU/Linux。
我要感谢@bootload 引导我找到答案的正确途径。
ffmpeg 似乎不支持向 .AAC 输出文件添加元数据标签,但是这里有两种可能的解决方法。
- 命令行实用程序 id3 和 id3v2(可从标准存储库获取)可以将 id3 标签应用于 .aac 音频文件。Nautilus 可识别 v1 和 v2 标签样式,因此两者都可以工作。Banshee 媒体播放器可识别相同的标签。
id3v2 -t "My Title" audio.aac
- ffmpeg 可以向 MP4 容器添加元数据,但 Nautilus 中的 .mp4 扩展名将显示为视频文件。Apple Inc. 使用非标准扩展名对 MP4 容器进行区分,以区分视频文件 (.m4v) 和音频文件 (.m4a)。Nautilus 和 ffmpeg 在 Debian 下可以识别这些扩展名。因此,
ffmpeg -i video.mp4 -vn -acodec copy -metadata title="My Title" audio.m4a
将生成一个 Nautilus 识别的仅音频文件,并且 ffmpeg 可以安全地将元数据添加到容器中。
答案2
目标硬件是什么?是用于 Apple iP* 设备吗?如果是,请尝试http://atomicparsley.sourceforge.net/ 否则尝试http://ffmpeg.org/ffmpeg.html#示例使用“UTF-8 编码的 INI”mex/demux 方法。(将元数据提取为 utf8 文件并修改并重新插入)。
答案3
MP4盒(属于“gpac”软件包)使用 MP4 容器封装 AAC 文件,而不会改变原始数据。然后可以使用几乎任何标记软件添加元数据:
MP4Box -add old.aac new.mp4
答案4
根据此,这个问题多年前已经修复票。
使用选项 -write_apetag 例如:
ffmpeg -i video.mp4 -vn -acodec copy -write_apetag 1 -metadata title="My Title" audio.aac