我想从 MP3 文件中提取元数据。这将进入一个脚本,因此我想从命令行执行此操作。由于我已经安装了 ffmpeg,我认为我可以用它来实现此目的。我发现这里以下描述:
使用 ffmpeg 提取 ffmetadata 文件的步骤如下:
ffmpeg -i INPUT -f ffmetadata FFMETADATAFILE
我尝试过这样的:
ffmpeg -i InSpace.mp3 -f ffmetadata meta.txt
发现它确实创建了meta.txt
所需的数据,但还将元数据以不同的格式转储到 stderr,以及错误消息输出文件为空,未编码任何内容(如果使用,请检查 -ss / -t / -frames 参数)。此外,它还会将此分页提示打印到 stderr:
Stream mapping:
Press [q] to stop, [?] for help
然后等我输入一些内容。
当然,我可以通过将命令编写为
ffmpeg -i InSpace.mp3 -f ffmetadata meta.txt </dev/null 2>/dev/null
但这看起来很不雅观,这也意味着真正的错误信息也被丢弃了。
我做错了什么?或者,有没有更好的方法从命令行提取元数据?
更新:
按照评论中的建议格雷格, 我试过:
ffprobe -show_entries 'stream_tags : format_tags' InSpace.mp3
这还在 stderr 上生成了大量文本(包括创建程序时使用的 gcc 版本等信息),但也将标签转储到 stdout。当然,我可以再次将 stderr 重定向到 /dev/null,虽然输出格式比 ffmpeg 生成的格式略显不方便,但从 stdout 获取信息比 ffmpeg 方法更灵活,因为 ffmpeg 方法迫使我为标签命名一个文件。在这方面,我认为它ffprobe
比我的方法有所改进ffmpeg
。
尽管如此,我想了解为什么我的 ffmpeg 命令会以这种方式运行。
答案1
FFmpeg 命令行为正确。
默认情况下,FFmpeg 是详细的。
您可以选择loglevel
仅获取错误。如果您不希望 FFmpeg 询问您是否要覆盖现有文件,
请使用标志。-y
ffmpeg -y -loglevel error -i InSpace.mp3 -f ffmetadata meta.txt
“输出文件为空,未编码任何内容”只是一个警告 - 文本文件不被视为输出文件,因为它不是音频(或视频)文件。
您可以使用参数选择 FFprobe 的输出格式-of
。
例如选择 JSON 格式:
ffprobe -loglevel error -show_entries stream_tags:format_tags -of json InSpace.mp3
答案2
ffprobe
我相信这是您想要的工具,因为它可以分析文件,而不是像 ffmpeg 那样尝试转换/制作文件。我对它不是很熟悉,但它的文档非常多。我相信ffprobe -hide_banner
(-hide_banner
下面详细介绍的功能)会隐藏该版本信息:
禁止打印横幅。所有 FFmpeg 工具通常都会显示版权声明、构建选项和库版本。此选项可用于禁止打印此信息。
您的命令似乎不必要地复杂,并且在我的 Windows 输出中添加了更多信息(您不想要的?):
ffprobe
文档的“作家”部分似乎要处理输出到 CSV 或其他文件,这似乎是您要尝试做的?说实话,我略读了您的问题,因为您似乎擅长使用 shell,所以也许只是需要帮助找到正确的工具和工具部分 ( man
)ual/documentation。
这也是一个-report
拥有大量信息的开关其中有大量信息似乎与提交错误有关;其调试/日志级别可以从详细级别降低(因此信息更少)。