ffplay 与 ffprobe 速览
本教程共 32 篇 · 第 5 篇 · 更新于 2026-08-09 · 约 6 分钟阅读
本节目标:会用 ffplay 快速播放和预览,会用 ffprobe 把一个媒体文件的「身份证」读出来。
除了主力 ffmpeg,安装包里还带了两个小工具:ffplay 负责播放,ffprobe 负责体检。处理文件前先让它们出场,能帮你避免很多「转了半天才发现源文件有问题」的尴尬。
ffplay:轻量播放器
ffplay 基于 SDL 和 FFmpeg 库,界面朴素但功能够用。它的价值在于:调命令的时候能立刻看结果,不用切换到大型播放器。
基本播放
ffplay input.mp4
直接打开一个窗口开始播放。除了本地文件,它也能播网络流:
ffplay rtmp://example.com/live/stream
ffplay https://example.com/video.mp4
甚至能直接播裸数据,只要告诉它格式:
ffplay -f rawvideo -pixel_format yuv420p -video_size 1920x1080 input.yuv
常用快捷键
播放时用键盘控制,鼠标点击进度条也能跳转:
| 按键 | 作用 |
|---|---|
q / Esc | 退出 |
f | 全屏切换 |
p / 空格 | 暂停/继续 |
a | 切换音轨 |
v | 切换视频流 |
t | 切换字幕流 |
m | 静音切换 |
| 左/右方向键 | 后退/前进 10 秒 |
| 下/上方向键 | 后退/前进 1 分钟 |
| 鼠标左键 | 跳转到点击位置 |
s | 逐帧步进(暂停时) |
常用选项
-x/-y:窗口宽高。-fs:直接全屏启动。-an/-vn:不播放音频/视频。-sn:不显示字幕。-ss 位置:从指定时间开始播。-t 时长:只播多少秒。-loop 次数:循环播放(0 表示无限循环)。-volume 0-100:起始音量。
比如从第 30 秒开始,只播 10 秒,窗口宽 800:
ffplay -ss 30 -t 10 -x 800 input.mp4
Tipffplay 是调试滤镜的好帮手。可以直接把滤镜图喂给它预览,不用等 ffmpeg 跑完整个文件:
ffplay -vf "scale=640:-1,transpose=1" input.mp4
ffprobe:媒体侦察兵
ffprobe 只读不写,专门输出文件的结构信息。拿到一个陌生视频,先让它看一眼,你就知道里面有几条流、用了什么编码器、分辨率多少、码率多高。
最基础的用法
ffprobe input.mp4
输出分几段:容器信息、每条流的信息、总结。加 -hide_banner 可以关掉开头的版本噪音:
ffprobe -hide_banner input.mp4
典型输出长这样:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
Metadata:
major_brand : isom
compatible_brands: isomiso2avc1mp41
encoder : Lavf61.5.101
Duration: 00:10:00.00, start: 0.000000, bitrate: 2500 kb/s
Stream #0:0[0x1](und): Video: h264 (High), yuv420p, 1920x1080, 2350 kb/s, 30 fps
Stream #0:1[0x2](und): Audio: aac, 48000 Hz, stereo, fltp, 128 kb/s
一眼能看出来:
- 容器是 MP4,时长 10 分钟,总码率约 2500 kbps。
- 视频流:H.264 High profile,yuv420p,1920×1080,约 2350 kbps,30 fps。
- 音频流:AAC,48 kHz,立体声,128 kbps。
只看错误,不打印别的
脚本里判断一个文件能不能读:
ffprobe -v error input.mp4
如果文件坏了或不支持,会打印错误;正常则什么都不输出。
输出结构化信息
ffprobe 支持把信息导出成 JSON、CSV、XML、INI 等格式,方便脚本解析。最常用的是 JSON:
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
参数解释:
-v quiet:彻底关掉日志。-print_format json:输出 JSON。-show_format:包含容器层信息。-show_streams:包含每条流的信息。
输出会是一个 JSON 对象,有 streams 数组和 format 对象,字段齐全,写脚本处理非常方便。
精确取一个字段
有时候只想拿一个值,比如宽度。可以用 -show_entries 指定字段,再配 -of csv=p=0 只输出原始值:
ffprobe -v error -select_streams v:0 \
-show_entries stream=width,height,r_frame_rate,codec_name \
-of csv=p=0 input.mp4
输出类似:
h264,1920,1080,30/1
常用字段:
format=duration,bit_rate,size,format_namestream=index,codec_type,codec_name,width,height,r_frame_rate,bit_rate,sample_rate,channels
看每一帧、每个包
进阶时会用到:
-show_packets:列出每个压缩包的信息(PTS、DTS、大小)。-show_frames:列出每一帧解码后的信息(关键帧、类型、时间戳)。-read_intervals 时间:只分析某一段时间。
比如列出所有关键帧的时间:
ffprobe -v error -select_streams v:0 \
-show_entries frame=pts_time,pict_type \
-of csv=p=0 input.mp4 | grep I
Note帧数多的视频用
-show_frames会输出巨量内容,先用-read_intervals限定一段,或者加-select_streams只看某条流。
三件套如何配合
典型的工作流是这样的:
- ffprobe 先看:搞清楚输入文件的编码、分辨率、有几条流。
- ffmpeg 干活:根据侦察结果决定是直接复制还是要重编码,该用什么参数。
- ffplay 验证:处理完后快速播放一下,确认画面声音都正常。
比如你拿到一个 MKV 文件想塞进 PR 剪辑,先 ffprobe 一下发现是 HEVC + FLAC,PR 支持不好。那就 ffmpeg 转成 H.264 + AAC 的 MP4,再用 ffplay 抽几秒看看有没有音画不同步。
小结
ffplay 文件直接播放,q退出,f全屏,p暂停,方向键跳转。ffprobe 文件打印完整信息;加-print_format json -show_format -show_streams输出结构化 JSON。- 用
-show_entries精确取字段,适合写脚本。 - 处理前先 ffprobe,处理后用 ffplay 验证,能省很多返工时间。
入门篇到这里就结束了。下一章开始,我们进入核心概念篇,先把容器、编码、流这三个最容易搞混的东西讲透。