Linux 下 FFprobe 命令基础使用指南:音视频信息分析利器
概述
FFprobe 是 FFmpeg 工具集里的核心组件之一,专门干音视频媒体信息提取与分析这件事。它能把音视频文件或网络流的底层数据扒得很透,包括容器格式(比如 MP4、MKV)、音视频流参数(编码格式、分辨率、比特率)、帧信息(帧率、帧类型)、元数据(标题、时长)等等,输出的格式既能被开发脚本解析,也能直接给人看。
跟那些图形化的分析工具(比如 MediaInfo)比,FFprobe 的优势在于:
- 命令行灵活控制:想看啥就筛啥(比如只看视频流编码、只看帧类型),不用看一堆冗余输出;
- 可编程集成:支持 JSON、XML 这类结构化输出,方便塞进自动化脚本(比如批量校验视频参数、排查格式异常的文件);
- 原生适配 FFmpeg 生态:和 FFmpeg、FFplay 共用一套核心库,FFmpeg 能兼容的音视频格式和协议它都支持。
不管你是做音视频开发调试(比如验证编码对不对)、运维质检(比如批量查视频分辨率),还是平时确认个格式,FFprobe 在 Linux 下都是个高效的好帮手。这篇系统梳理一下 FFprobe 的基础命令和核心用法,帮你快速上手媒体信息分析。
一、FFprobe 基础:信息查询与环境验证
用 FFprobe 分析媒体之前,先掌握“看帮助”“验证版本”这些基础命令,确认工具环境没问题。
1. 查看帮助信息
查一下 FFprobe 支持的所有参数说明,新手重点关注“信息显示选项”“输出格式控制”那部分:
ffprobe -h # 显示基础帮助:包含核心参数、信息筛选选项(推荐入门)
ffprobe -h long # 显示详细帮助:包含高级参数(如输出格式配置、流筛选规则)
2. 查看版本与编译配置
确认一下 FFprobe 的版本,以及编译时都启用了哪些功能(比如支不支持某个容器格式、编解码器):
ffprobe -version # 查看版本、编译日期、依赖库(如 libavformat 版本)
ffprobe -buildconf # 查看编译配置:启用的容器格式、编解码器、协议等(排查功能缺失问题)
3. 隐藏启动 Banner(精简输出)
FFprobe 启动时默认会显示版本、编译信息之类的“Banner”,要是想让输出干净点(比如写脚本解析时不想被它干扰),可以把 Banner 藏起来:
ffprobe -hide_banner input.mp4 # 分析文件时不显示 Banner,仅保留媒体信息
二、FFprobe 核心命令:提取关键媒体信息
FFprobe 的命令格式是 ffprobe [options] [input_url],其中 input_url 可以是本地文件(比如 test.mp4)、网络流(比如 rtmp://xxx/live/stream)或者设备(比如摄像头 /dev/video0)。下面按“容器信息”“流信息”“帧信息”这些核心场景,把常用命令整理出来。
1. 查看容器格式信息(-show_format)
提取音视频文件的容器层级信息,包括文件大小、时长、格式类型(比如 MP4、FLV)、元数据(标题、作者)等,适合快速确认文件整体属性:
# 基础用法:显示容器格式信息(含默认输出)
ffprobe -show_format input.mp4
# 优化输出:隐藏 Banner + 仅显示格式信息(避免冗余)
ffprobe -hide_banner -show_format input.mp4
# 结构化输出:以 JSON 格式输出(便于脚本解析)
ffprobe -hide_banner -show_format -print_format json input.mp4
输出关键信息说明:
- format_name:容器格式(如 mov,mp4,m4a,3gp,3g2,mj2);
- duration:文件时长(单位:秒,带小数精度);
- size:文件大小(单位:字节);
- bit_rate:总比特率(单位:比特 / 秒,反映文件整体码率);
- tags:元数据(如 title 标题、artist 作者、creation_time 创建时间)。
2. 查看音视频流信息(-show_streams)
提取文件里每一条流的详细参数(视频流、音频流、字幕流),包括编码格式、分辨率、采样率等,这是最常用的分析场景(比如确认视频是不是 H.264 编码、音频是不是 AAC):
# 基础用法:显示所有流信息(视频、音频、字幕)
ffprobe -hide_banner -show_streams input.mp4
# 筛选指定流:仅显示视频流(-select_streams v)
ffprobe -hide_banner -select_streams v -show_streams input.mp4
# 筛选指定流:仅显示音频流(-select_streams a)
ffprobe -hide_banner -select_streams a -show_streams input.mp4
# 结构化输出:以 XML 格式输出音频流信息(便于批量处理)
ffprobe -hide_banner -select_streams a -show_streams -print_format xml input.mp4
输出关键信息说明(视频流):
- codec_name:视频编码格式(如 h264、hevc);
- width/height:视频分辨率(如 1920×1080);
- r_frame_rate:帧率(如 25/1 表示 25 FPS);
- bit_rate:视频流比特率(单位:比特 / 秒);
- pix_fmt:像素格式(如 yuv420p,影响画质与兼容性)。
输出关键信息说明(音频流):
- codec_name:音频编码格式(如 aac、mp3);
- sample_rate:采样率(如 44100 表示 44.1 kHz);
- channels:声道数(如 2 表示立体声、1 表示单声道);
- bit_rate:音频流比特率(单位:比特 / 秒)。
3. 查看媒体包信息(-show_packets)
提取音视频包(Packet)的底层数据,包括包类型(视频包 / 音频包)、时间戳(PTS/DTS)、包大小、所属流索引等,适合深入分析流的封装结构(比如排查包丢失、时间戳异常):
# 基础用法:显示所有包信息
ffprobe -hide_banner -show_packets input.mp4
# 筛选指定流的包:仅显示视频流的包(-select_streams v)
ffprobe -hide_banner -select_streams v -show_packets input.mp4
# 简化输出:仅显示包的时间戳与大小(通过 -show_entries 筛选字段)
ffprobe -hide_banner -show_packets -show_entries packet=pts,dts,size input.mp4
输出关键信息说明:
- stream_index:包所属流的索引(对应 -show_streams 中的 index);
- pts/dts:显示时间戳 / 解码时间戳(单位:毫秒,反映音视频同步关系);
- size:包大小(单位:字节,反映码率波动);
- flags:包标记(如 K 表示关键帧包、A 表示音频包)。
4. 查看帧与字幕信息(-show_frames)
提取音视频帧(Frame)的详细数据,包括帧类型(I 帧 / P 帧 / B 帧)、帧大小、播放时间、所属流等,同时还能看字幕帧内容,适合分析画质压缩(比如关键帧间隔)、字幕同步问题:
# 基础用法:显示所有帧信息(视频帧、音频帧、字幕帧)
ffprobe -hide_banner -show_frames input.mp4
# 筛选指定流的帧:仅显示视频帧
ffprobe -hide_banner -select_streams v -show_frames input.mp4
# 筛选关键帧:仅显示视频流的 I 帧(通过 -show_entries 与 -filter:v 组合)
ffprobe -hide_banner -select_streams v -show_frames -show_entries frame=pict_type,pts -filter:v "eq(pict_type\,I)" input.mp4
# 查看字幕帧:显示字幕内容与时间戳
ffprobe -hide_banner -select_streams s -show_frames input.mp4
输出关键信息说明(视频帧):
- pict_type:帧类型(I 关键帧、P 预测帧、B 双向预测帧);
- pts:帧显示时间戳(单位:毫秒,决定帧的播放顺序);
- pkt_size:帧大小(单位:字节,影响码率);
- width/height:帧分辨率(与视频流分辨率一致)。
5. 查看程序与流关联信息(-show_programs)
提取多节目(Program)封装文件的节目与流关联关系,适合分析多频道视频(比如含多个节目流的 TS 文件),搞清楚每个节目都包含哪些视频流、音频流、字幕流:
# 基础用法:显示所有节目及关联的流信息
ffprobe -hide_banner -show_programs input.ts
# 结构化输出:以 JSON 格式输出(便于脚本解析节目与流的映射关系)
ffprobe -hide_banner -show_programs -print_format json input.ts
输出关键信息说明:
- program_id:节目 ID(唯一标识);
- streams:节目包含的流列表(每个流对应 -show_streams 中的 index);
- tags:节目元数据(如 service_name 节目名称、service_provider 服务商)。
6. 查看章节信息(-show_chapters)
提取文件里章节(Chapter)的时间范围和元数据,适合分析带章节标记的视频(比如电影的“片头”“正片”“片尾”分段),搞清楚每个章节从哪开始到哪结束:
# 基础用法:显示所有章节信息
ffprobe -hide_banner -show_chapters input.mp4
# 结构化输出:以 XML 格式输出(便于批量提取章节时间)
ffprobe -hide_banner -show_chapters -print_format xml input.mp4
输出关键信息说明:
- id:章节 ID(唯一标识);
- start_time/end_time:章节起始 / 结束时间(单位:秒);
- tags:章节元数据(如 title 章节标题,如 “Chapter 1: Opening”)。
三、实用技巧:筛选与结构化输出
FFprobe 可以通过参数精准筛选信息、控制输出格式,避免被冗余数据干扰,下面几个是高频实用技巧:
1. 筛选指定字段(-show_entries)
用 -show_entries 只输出你想要的字段,减少输出量(比如只看视频流的编码和分辨率):
# 示例1:仅查看视频流的编码格式(codec_name)与分辨率(width/height)
ffprobe -hide_banner -select_streams v -show_streams -show_entries stream=codec_name,width,height input.mp4
# 示例2:仅查看容器的时长(duration)与总比特率(bit_rate)
ffprobe -hide_banner -show_format -show_entries format=duration,bit_rate input.mp4
2. 结构化输出(-print_format)
支持 JSON、XML、CSV 等格式输出,方便脚本解析(比如用 Python 批量处理):
# JSON 格式输出(最常用,便于脚本解析)
ffprobe -hide_banner -show_streams -print_format json input.mp4 > streams_info.json
# XML 格式输出(适合需按标签解析的场景)
ffprobe -hide_banner -show_format -print_format xml input.mp4 > format_info.xml
# 紧凑 JSON 格式(去除换行,适合传输)
ffprobe -hide_banner -show_streams -print_format json=compact=1 input.mp4
3. 静默模式(-v quiet)
只输出你指定的信息(比如 -show_streams),不显示日志(适合写脚本时避免干扰):
# 静默模式 + 仅显示视频流信息 + JSON 输出(无任何多余日志)
ffprobe -v quiet -hide_banner -select_streams v -show_streams -print_format json input.mp4
四、常见使用场景示例
结合实际需求,整理了几个 FFprobe 高频使用场景,可以直接拿来用:
场景 1:批量检查视频分辨率是否符合要求(如 1080P)
# 编写脚本:遍历目录下所有 MP4 文件,检查视频流是否为 1920×1080
for file in *.mp4; do
echo "检查文件:$file"
ffprobe -v quiet -hide_banner -select_streams v -show_streams -show_entries stream=width,height -print_format json "$file" | jq '.streams[] | select(.width == 1920 and .height == 1080) | .width, .height'
if [ $? -ne 0 ]; then
echo "$file 分辨率不符合 1080P 要求"
fi
done
场景 2:提取网络流的编码格式与比特率(如 RTMP 直播流)
# 分析 RTMP 流,提取视频编码、音频编码、总比特率
ffprobe -v quiet -hide_banner -show_format -show_streams -select_streams v:a -show_entries stream=codec_name,format=bit_rate -print_format json rtmp://live.hkstv.hk.lxdns.com/live/hks
场景 3:查看视频关键帧间隔(分析 I 帧分布)
# 提取视频流的 I 帧时间戳,计算关键帧间隔
ffprobe -v quiet -hide_banner -select_streams v -show_frames -show_entries frame=pts,pict_type -filter:v "eq(pict_type\,I)" -print_format csv=p=0 input.mp4
总结
FFprobe 作为 FFmpeg 生态里的“信息分析中枢”,核心价值就是精准、灵活地提取音视频底层数据。不管日常确认格式(比如“这视频是什么编码?”),还是开发运维的自动化需求(比如“批量校验 1000 个视频的分辨率”),FFprobe 都能靠命令行参数快速搞定。
新手入门建议先掌握 -show_format(容器信息)和 -show_streams(流信息)这两个核心命令,再慢慢探索 -show_frames(帧分析)、结构化输出这些进阶用法。想再往深钻,可以翻翻 FFmpeg 官方文档,结合实际场景练练参数组合,才能真正发挥它的高效分析能力。