使用 ffmpeg 判断一个文件是否为 MP3 格式
在 Linux(如 Ubuntu)中,使用 ffmpeg 判断一个文件是否为 MP3 格式,可以通过以下几种可靠方式实现。核心思路是:让 ffmpeg 探测文件的容器格式和音频编码,并检查是否匹配 MP3。
✅ 推荐方法:使用 ffprobe(FFmpeg 自带的探测工具)
ffprobe是专门用于分析媒体文件元数据的工具,比直接用ffmpeg更轻量、更准确。
🔹 命令 1:检查容器格式是否为 mp3
ffprobe -v quiet -show_entries format=format_name -of csv=p=0 input.mp3
- 如果输出是
mp3,说明容器格式是 MP3。 - 示例:
$ ffprobe -v quiet -show_entries format=format_name -of csv=p=0 song.mp3 mp3
🔹 命令 2:检查音频编码是否为 MP3(更本质)
ffprobe -v quiet -select_streams a:0 -show_entries stream=codec_name -of csv=p=0 input.mp3
- 如果输出是
mp3,说明音频编码是 MP3(即使文件扩展名不是 .mp3)。 - 注意:有些 MP3 文件可能被封装在其他容器中(罕见),但绝大多数 MP3 文件的
codec_name就是mp3。
✅ 组合判断(推荐用于脚本)
#!/bin/bash
file="your_file"
# 获取编码器名称(第一个音频流)
codec=$(ffprobe -v quiet -select_streams a:0 -show_entries stream=codec_name -of csv=p=0 "$file" 2>/dev/null)
if [ "$codec" = "mp3" ]; then
echo "✅ 是 MP3 格式"
else
echo "❌ 不是 MP3 格式(实际编码:$codec)"
fi
💡 为什么优先看
codec_name而不是format_name?
因为 MP3 本质上是一种音频编码格式。虽然通常用.mp3作为文件扩展名(对应format_name=mp3),但技术上 MP3 音频也可能出现在其他容器中(如 AVI、MKV),不过极少见。反过来,.mp3文件几乎总是使用mp3编码。
⚠️ 不推荐:仅靠文件扩展名
# ❌ 不可靠!
[[ "$file" == *.mp3 ]] && echo "可能是 MP3"
- 用户可随意改扩展名,无法保证内容真实格式。
🔍 补充:查看完整信息(调试用)
ffprobe -v quiet -show_format -show_streams input.mp3
输出中关注:
format_name=mp3codec_name=mp3(在[STREAM]段落中)
🛠️ 如果系统没有 ffprobe?
虽然你已安装 ffmpeg,但某些精简版可能未包含 ffprobe。此时可用 ffmpeg 代替(效率较低):
# 通过解析 ffmpeg 的输入信息判断
if ffmpeg -v quiet -i input.mp3 -f null - 2>&1 | grep -q 'Audio: mp3'; then
echo "✅ 是 MP3"
else
echo "❌ 不是 MP3"
fi
原理:
ffmpeg -i file会打印流信息,其中包含Audio: mp3, ...字样。
✅ 总结
| 方法 | 命令 | 优点 |
|---|---|---|
| 首选 | ffprobe -show_entries stream=codec_name ... |
准确、快速、专为探测设计 |
| 备用 | `ffmpeg -i file 2>&1 | grep 'Audio: mp3'` |
| 避免 | 仅检查 .mp3 扩展名 |
不可靠 |
建议在脚本中使用 ffprobe + codec_name 方式判断,最权威。
No Comments