use*_*428 6 metadata ffmpeg ffprobe
我想从 MP3 文件中提取元数据。这将进入脚本,因此我想从命令行执行此操作。由于我已经安装了 ffmpeg,我想我可以用它来实现这个目的。我在这里找到了以下描述:
使用 ffmpeg 提取 ffmetadata 文件如下:
ffmpeg -i INPUT -f ffmetadata FFMETADATAFILE
Run Code Online (Sandbox Code Playgroud)
我尝试过这样的:
ffmpeg -i InSpace.mp3 -f ffmetadata meta.txt
Run Code Online (Sandbox Code Playgroud)
并发现它确实使用meta.txt所需的数据创建,但也将不同格式的元数据转储到stderr,以及错误消息输出文件为空,没有编码(如果使用,请检查 -ss / -t / -frames 参数)。此外,它还会将此分页提示打印到 stderr:
Stream mapping:
Press [q] to stop, [?] for help
Run Code Online (Sandbox Code Playgroud)
然后等我输入一些东西。
当然,我可以通过将命令编写为来解决这个问题
ffmpeg -i InSpace.mp3 -f ffmetadata meta.txt </dev/null 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
但这看起来很不优雅,而且也意味着真正的错误消息也被丢弃了。
我做错了什么?或者,是否有更好的方法从命令行提取元数据?
更新:
按照gregg评论中的建议,我尝试了:
ffprobe -show_entries 'stream_tags : format_tags' InSpace.mp3
Run Code Online (Sandbox Code Playgroud)
这也在 stderr 上产生了大量文本(包括诸如使用哪个 gcc 版本来创建程序之类的信息),而且还将标签转储到 stdout。当然,我可以再次将 stderr 重定向到 /dev/null,虽然输出格式比 ffmpeg 生成的格式稍微不太方便,但获取 stdout 上的信息比 ffmpeg 方法更灵活,这迫使我命名一个文件对于标签。在这方面,我认为ffprobe我的方法有所改进ffmpeg。
尽管如此,我想了解为什么我的 ffmpeg 命令会以这种方式运行。
FFmpeg 命令行为是正确的。
默认情况下,FFmpeg 是详细的。
您可以选择loglevel仅获取错误。如果您不希望 FFmpeg 询问您是否要覆盖现有文件,
请使用flag。-y
ffmpeg -y -loglevel error -i InSpace.mp3 -f ffmetadata meta.txt
Run Code Online (Sandbox Code Playgroud)
“输出文件为空,未编码任何内容”只是一个警告 - 文本文件不被视为输出文件,因为它不是音频(或视频)文件。
您可以使用参数选择 FFprobe 的输出格式-of。
选择 JSON 格式例如:
ffprobe -loglevel error -show_entries stream_tags:format_tags -of json InSpace.mp3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23838 次 |
| 最近记录: |