Skip to main content

使用 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=mp3
  • codec_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 方式判断,最权威。