我希望能够为所有主流音频文件格式添加章节标记,FFmpeg 可以做到这一点(使用-map_chapters
选项)——但FFmpeg 总是会破坏其他元数据。它无法识别的任何标签都会从目标文件中删除。如何通过命令行为音频文件添加章节标记而不操作任何其他元数据?
我希望能够为所有主流音频文件格式添加章节标记,FFmpeg 可以做到这一点(使用-map_chapters
选项)——但FFmpeg 总是会破坏其他元数据。它无法识别的任何标签都会从目标文件中删除。如何通过命令行为音频文件添加章节标记而不操作任何其他元数据?
简单的解决方案
有一些更简单的解决方案专门用于某些文件格式:对于 ID3(
.mp3
, 等)有mp3chap
,对于 VorbisComment(.ogg
,.flac
,.opus
等)有……嗯,vorbiscomment
,对于 ISOBMFF(.mp4
,.m4a
,.m4b
等)有……在撰写本文时,真的只有 FFmpeg。(如果您对 GUI 程序没问题,可以使用Kid3,并在设置中启用 MP4v2 插件。)如果有人想要关于如何使用这些的建议,请 ping 我,我可以提供帮助 - 但现在,我想专注于……“一刀切”解决方案
有一种方法可以以相同的方式可靠地将章节添加到所有主要音频元数据格式 - ID3(
.mp3
等)、ISOBMFF(.mp4
、.m4a
、.m4b
等)和 VorbisComment(.ogg
、.flac
、.opus
等)。但是,这有点复杂,最适合包含在脚本中,而不是手动使用。它需要两个工具:
给定一个音频文件
audio.m4a
(可以是任何格式,不仅仅是.m4a
)和一个包含章节的 FFmpeg 元数据文件(ffmetadata.txt
您可以手动构建它,或者例如使用此 Python 脚本转换 Audacity 标签导出),执行以下步骤:然后用临时文件替换原始文件(
mv -f temp.m4a audio.m4a
在 Linux 上;move -force temp.m4a audio.m4a
在 PowerShell 上)。注意:如果原始文件已经有您想要替换的章节,情况会变得有点复杂,因为 Kid3 会复制某些文件格式的章节,从而重置您刚刚覆盖的章节。为此,我创建了一个 QML 脚本,您可以下载并运行它
kid3-cli
- 步骤如下:该解决方案应该可以完美地适用于所有情况。
一些注释…
在我为此进行研究的日子里,我偶然发现了一些可能对某些人有用的东西:
desc
ISOBMFF/MP4 元数据中的描述标签),使我们陷入与 FFmpeg 相同的困境。-movflags disable_chpl
到您的 FFmpeg 调用中。在 ISOBMFF/MP4 文件中,默认情况下,FFmpeg 会创建 QuickTime 样式的章节(使用CHAP
原子)和Nero 元数据章节(使用CHPL
原子)。但实际上,QuickTime 样式的章节得到了更广泛的支持。-map_metadata
,而不是-map_chapters
ISOBMFF/MP4 文件的一部分。这就是为什么需要-map_chapters 1
和的原因。-map_metadata 1
paste
和save
)似乎仅在您选择位于当前工作目录中的文件时才有效。如果您从另一个目录运行 Kid3 命令,请-c "cd 'your-audio-directory/'"
在最后的 之前随时添加select
。