# 使用 ffmpeg 判断一个文件是否为 MP3 格式

在 Linux（如 Ubuntu）中，使用 `ffmpeg` 判断一个文件是否为 **MP3 格式**，可以通过以下几种可靠方式实现。核心思路是：**让 ffmpeg 探测文件的容器格式和音频编码，并检查是否匹配 MP3**。

---

### ✅ 推荐方法：使用 `ffprobe`（FFmpeg 自带的探测工具）

> `ffprobe` 是专门用于分析媒体文件元数据的工具，比直接用 `ffmpeg` 更轻量、更准确。

#### 🔹 命令 1：检查容器格式是否为 `mp3`

```bash
ffprobe -v quiet -show_entries format=format_name -of csv=p=0 input.mp3

```

- 如果输出是 `mp3`，说明容器格式是 MP3。
- 示例： ```bash
    $ ffprobe -v quiet -show_entries format=format_name -of csv=p=0 song.mp3
    mp3
    
    ```

#### 🔹 命令 2：检查音频编码是否为 MP3（更本质）

```bash
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`。

---

### ✅ 组合判断（推荐用于脚本）

```bash
#!/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` 编码。

---

### ⚠️ 不推荐：仅靠文件扩展名

```bash
# ❌ 不可靠！
[[ "$file" == *.mp3 ]] && echo "可能是 MP3"

```

- 用户可随意改扩展名，无法保证内容真实格式。

---

### 🔍 补充：查看完整信息（调试用）

```bash
ffprobe -v quiet -show_format -show_streams input.mp3

```

输出中关注：

- `format_name=mp3`
- `codec_name=mp3`（在 `[STREAM]` 段落中）

---

### 🛠️ 如果系统没有 `ffprobe`？

虽然你已安装 `ffmpeg`，但某些精简版可能未包含 `ffprobe`。此时可用 `ffmpeg` 代替（效率较低）：

```bash
# 通过解析 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, ...` 字样。

---

### ✅ 总结

<table id="bkmrk-%E6%96%B9%E6%B3%95-%E5%91%BD%E4%BB%A4-%E4%BC%98%E7%82%B9-%E9%A6%96%E9%80%89-ffprobe-"><thead><tr><th>方法</th><th>命令</th><th>优点</th></tr></thead><tbody><tr><td>**首选**</td><td>`ffprobe -show_entries stream=codec_name ...`</td><td>准确、快速、专为探测设计</td></tr><tr><td>备用</td><td>`ffmpeg -i file 2&gt;&amp;1</td><td>grep 'Audio: mp3'`</td></tr><tr><td>避免</td><td>仅检查 `.mp3` 扩展名</td><td>不可靠</td></tr></tbody></table>

建议在脚本中使用 `ffprobe` + `codec_name` 方式判断，最权威。