3、查看媒体信息:ffprobe工具使用、查看容器格式、编码格式、分辨率、码率、帧率等元数据
做音视频开发这么多年,我几乎每天都要跟ffprobe打交道。它就像一把瑞士军刀,能帮你把媒体文件的底裤都扒干净。说白了,ffprobe就是FFmpeg家族里专门负责「看」的工具——看格式、看编码、看参数、看流信息。
你想想看,拿到一个陌生的视频文件,你总得先知道它是什么来头吧?是MP4还是MKV?视频是H.264还是HEVC?音频是AAC还是MP3?分辨率多少?码率多高?这些信息,ffprobe几秒钟就能给你整得明明白白。
3.1 ffprobe基础用法
先来个最简单的。打开终端,敲下这行命令:
ffprobe input.mp4
输出结果大概长这样:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.76.100
Duration: 00:02:30.00, start: 0.000000, bitrate: 1256 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 1024 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s
嗯,这里要注意。第一行告诉你容器格式是mov/mp4。Duration是时长,2分30秒。bitrate是总码率1256 kb/s。然后两个流:视频流是H.264编码,分辨率1920x1080,码率1024 kb/s,帧率25fps;音频流是AAC编码,采样率44100Hz,立体声,码率128 kb/s。
我个人习惯,拿到文件第一件事就是看这三个参数:分辨率、编码格式、帧率。这三个决定了这个文件的基本素质。
3.2 只看关键信息:-v error -show_entries
ffprobe默认输出太啰嗦了。有时候我只想看几个关键字段。这时候用-v error -show_entries组合拳:
ffprobe -v error -show_entries format=format_name,duration,bit_rate -show_entries stream=codec_name,codec_type,width,height,r_frame_rate,bit_rate -of default=noprint_wrappers=1 input.mp4
输出会清爽很多:
[FORMAT]
format_name=mov,mp4,m4a,3gp,3g2,mj2
duration=150.000000
bit_rate=1256000
[/FORMAT]
[STREAM]
codec_name=h264
codec_type=video
width=1920
height=1080
r_frame_rate=25/1
bit_rate=1024000
[/STREAM]
[STREAM]
codec_name=aac
codec_type=audio
bit_rate=128000
[/STREAM]
你看,这样是不是一目了然?-of default=noprint_wrappers=1是去掉多余的包装,让输出更干净。我建议你把这个命令存成别名,省得每次敲一长串。
-of default=noprint_wrappers=1 换成 -of json 就行。这样方便程序解析。
3.3 查看容器格式细节
容器格式不仅仅是「MP4」或「MKV」这么简单。里面还藏着很多元数据。用这个命令可以看全:
ffprobe -v error -show_format input.mp4
输出会包含:
- format_name:容器格式名称
- duration:总时长(秒)
- size:文件大小(字节)
- bit_rate:总码率
- nb_streams:流数量
- metadata:各种元数据标签
我记得有一次,客户给了一个视频文件,播放器死活打不开。我用ffprobe一看,format_name显示的是matroska,webm,但文件后缀是.mp4。这就是典型的「挂羊头卖狗肉」——容器格式和扩展名不匹配。后来让客户重新封装了一下就好了。
3.4 查看编码格式与编码参数
编码格式决定了视频的压缩效率和画质。用-show_streams可以看每个流的详细编码参数:
ffprobe -v error -show_streams input.mp4
对于视频流,重点关注:
| 参数 | 含义 | 示例值 |
|---|---|---|
| codec_name | 编码器名称 | h264, hevc, vp9 |
| codec_long_name | 编码器全称 | H.264 / AVC |
| profile | 编码档次 | High, Main, Baseline |
| level | 编码级别 | 40, 41, 50 |
| pix_fmt | 像素格式 | yuv420p, yuv422p |
| color_space | 色彩空间 | bt709, bt2020 |
对于音频流,重点关注:
| 参数 | 含义 | 示例值 |
|---|---|---|
| codec_name | 编码器名称 | aac, mp3, ac3 |
| sample_rate | 采样率 | 44100, 48000 |
| channels | 声道数 | 2 (stereo), 6 (5.1) |
| bit_rate | 音频码率 | 128000, 192000 |
为什么会关注profile和level?因为有些老旧设备只支持Baseline档次,你给个High Profile的视频,人家播不了。我曾经在嵌入式设备上踩过这个坑,视频编码用了High Profile,结果设备解码器不支持,画面全是马赛克。后来改成Main Profile就没事了。
3.5 查看分辨率、码率、帧率
这三个参数是视频质量的核心指标。用-select_streams v:0只选第一个视频流:
ffprobe -v error -select_streams v:0 -show_entries stream=width,height,bit_rate,r_frame_rate,avg_frame_rate input.mp4
输出:
[STREAM]
width=1920
height=1080
bit_rate=1024000
r_frame_rate=25/1
avg_frame_rate=25/1
[/STREAM]
这里有个坑要注意。r_frame_rate是基础帧率,avg_frame_rate是平均帧率。对于固定帧率的视频,两者一样。但对于VFR(可变帧率)视频,avg_frame_rate才是实际的平均帧率。我遇到过一些录屏软件生成的视频,标称60fps,但实际平均帧率只有30fps,就是因为画面静止时自动降帧了。
码率这块,bit_rate显示的是流码率。但有些封装格式不记录这个值,会显示为N/A。这时候可以用-show_packets自己算,不过那是后话了。
3.6 实战:一键生成媒体信息报告
我平时写了个小脚本,一键生成媒体文件的完整报告。分享给你:
#!/bin/bash
# 用法:./mediainfo.sh input.mp4
INPUT=$1
echo "========== 容器信息 =========="
ffprobe -v error -show_entries format=format_name,duration,size,bit_rate,nb_streams -of default=noprint_wrappers=1 "$INPUT"
echo ""
echo "========== 视频流信息 =========="
ffprobe -v error -select_streams v:0 -show_entries stream=codec_name,profile,level,width,height,pix_fmt,bit_rate,r_frame_rate,color_space -of default=noprint_wrappers=1 "$INPUT"
echo ""
echo "========== 音频流信息 =========="
ffprobe -v error -select_streams a:0 -show_entries stream=codec_name,sample_rate,channels,channel_layout,bit_rate -of default=noprint_wrappers=1 "$INPUT"
echo ""
echo "========== 字幕流信息 =========="
ffprobe -v error -select_streams s:0 -show_entries stream=codec_name,index -of default=noprint_wrappers=1 "$INPUT"
这个脚本会分别输出容器、视频、音频、字幕的信息。我把它放在/usr/local/bin/mediainfo里,随时调用。你想想看,拿到一个文件,跑一下这个脚本,所有关键信息就全出来了,多省事。
3.7 知识体系图
下面这张图总结了ffprobe查看媒体信息的核心逻辑:
这张图把ffprobe的信息查看分成了两大块:容器信息和流信息。容器信息看整体,流信息看细节。视频流里重点看编码、分辨率、帧率、码率;音频流里重点看编码、采样率、声道数。掌握了这个框架,任何媒体文件在你面前都是透明的。
ffprobe input.mp4是最基础的用法,能看到所有信息-v error -show_entries可以精确控制输出字段-select_streams v:0只选视频流,a:0只选音频流- 容器格式 ≠ 编码格式,别搞混了
- 帧率要看
avg_frame_rate,尤其是VFR视频
好了,ffprobe查看媒体信息这块就聊到这儿。这些命令我每天都在用,确实很顺手。你上手之后会发现,它比那些图形界面的媒体信息工具好用多了——快、准、还能集成到脚本里自动化处理。
公众号:蓝海资料掘金营,微信deep3321