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