1154 字
约 3 分钟
0
ffprobe 技术入门(中文)
ffprobe 技术入门(中文)
ffprobe 是 ffmpeg 家族里"只看不改"的只读工具箱。它读取媒体文件的头信息,告诉你文件是什么格式、每个流(视频/音频/字幕)用什么编码、分辨率、码率、时长、元数据等——不做任何转换,不产生新文件。
与 ffmpeg 成对:ffprobe 负责"看",ffmpeg 负责"改"。
一、它是什么 / 一句话
ffprobe = 音视频文件的"体检/查看窗口"。输入一个文件路径,输出它的容器格式、流列表、各流编码参数、时长、元数据等结构化信息。零破坏,纯只读。
二、什么时候用它(判断场景)
| 场景 | 用 ffprobe? | 为什么 |
|---|---|---|
| 想知道某个视频"是不是 .mp4 / 几秒 / 多少分辨率 / 什么编码" | ✅ | 快速看头信息 |
| 想确认某文件有没有声音轨、音轨是什么格式 | ✅ | 列出流 |
| 转码/合并前先确认源文件参数 | ✅ | 避免 ffmpeg 转错或失败 |
| 脚本里要"读取文件的时长/宽度/高度"做判断 | ✅ | 输出 JSON/可编程 |
| 想把文件转码、改格式、合并且产生新文件 | ❌ 用 ffmpeg | ffprobe 不改文件 |
| 只想确认装没装 | ❌ ffprobe -version |
见安装 |
[!tip] 判断口诀:要不要产出新文件?要 → ffmpeg;只要读信息 → ffprobe。
三、核心概念
- 容器 Container:外层壳(
.mp4、.mkv、.ts、.webm),决定文件扩展名与装箱方式。 - 流 Stream:里面的各轨道——
video(视频)、audio(音频)、subtitle(字幕)、data(数据/章节点)。 - 编码 Codec:每个流怎么压缩,如
h264、h265/hevc、vp9、aac、opus、mp3。 - 一个文件可以有多个流(多个音轨/字幕轨),ffprobe 会把每一个都列出来。
四、常用命令模板(可直接抄)
# 0) 版本检查
ffprobe -version
# 1) 只读最基础信息:容器格式 + 时长 + 音频/视频流概要 ★最常用
ffprobe input.mp4
# 输出示例包含:Input #0, mov,mp4, Duration: 00:01:23.45, Video: h264 1280x720, Audio: aac
# 2) 只输出视频流(不打印音频/章节等)
ffprobe -v error -select_streams v -show_streams input.mp4
# 3) 只问"文件总时长(秒)"
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1 input.mp4
# 4) 只问"宽度 x 高度"
ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 input.mp4
# 5) 输出成 JSON(脚本友好,自动化必用)
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
# 6) 只列出有哪些流 + 编码(概览)
ffprobe -show_streams -of compact=p=0 input.mp4 | grep -E 'codec_name|codec_type'
[!tip] 常用参数组合
-v error:只显示错误,不显示重复的格式头信息,配合-of/-show_entries得到干净的单行结果,便于脚本解析。
五、输出格式 -of / -print_format 选择
| 格式 | 适合 | 示例 |
|---|---|---|
default |
人看 | 段落式 |
json |
脚本 | { "format": {...}, "streams": [...] } |
csv / flat / compact |
简单取值 | 一行一个值 |
# 例:把时长取成纯数字
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4
# 例:JSON 里取第 0 个视频流的 codec_name
ffprobe -v quiet -print_format json -show_streams input.mp4 | python3 -c "import json,sys;d=json.load(sys.stdin);print([s['codec_name'] for s in d['streams'] if s['codec_type']=='video'])"
六、最常用参数速查
| 参数 | 含义 |
|---|---|
-v error / -v quiet |
只输出错误/几乎不出杂讯 |
-select_streams |
只分析某个流(v:0=第一个视频轨,a=所有音频) |
-show_format |
显示容器层信息(时长、大小、标签) |
-show_streams |
显示每个流的信息(编码、分辨率、码率…) |
-show_entries |
只挑需要的字段,减少输出 |
-of / -print_format |
输出格式(default/json/csv/flat/compact) |
-count_frames |
顺便统计实际帧数(慢,默认不数) |
七、安装方法(和 ffmpeg 一起装)
ffprobe 随 ffmpeg 一起发布,装了 ffmpeg 就有 ffprobe:
# macOS: brew install ffmpeg
# Linux: sudo apt install ffmpeg
# Windows: 用 ffmpeg 完整包(gyan.dev build / winget / choco),其 /bin 内含 ffprobe.exe
装完验证:ffprobe -version。
八、和 yt-dlp 的关系
- yt-dlp 的
FFmpegPostProcessor常先ffprobe确认已下载文件的关键参数,再决定 ffmpeg 该怎么做(如封面尺寸、是否需转码)。 - 用
--ffmpeg-location <路径>可同时指定 ffmpeg 与 ffprobe 所在目录。 - 相关代码:
yt_dlp/postprocessor/ffmpeg.py。
[!tip] 成对记忆:ffprobe "看",ffmpeg "改"。先看([[ffprobe 技术入门]])再改([[ffmpeg 技术入门]]),是处理音视频的标准流程。
评论
0 条
还没有评论,先写一条吧。