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是去掉多余的包装,让输出更干净。我建议你把这个命令存成别名,省得每次敲一长串。

小技巧: 如果你想要JSON格式的输出,把 -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。这就是典型的「挂羊头卖狗肉」——容器格式和扩展名不匹配。后来让客户重新封装了一下就好了。

注意: 容器格式和编码格式是两码事。MP4容器里可以装H.264视频+AAC音频,也可以装HEVC视频+AC-3音频。别搞混了。

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 媒体信息查看 容器格式 (format) format_name duration / size bit_rate 流信息 (streams) 视频流 (v:0) 音频流 (a:0) 字幕流 (s:0) codec / resolution / fps / bitrate codec / sample_rate / channels

这张图把ffprobe的信息查看分成了两大块:容器信息和流信息。容器信息看整体,流信息看细节。视频流里重点看编码、分辨率、帧率、码率;音频流里重点看编码、采样率、声道数。掌握了这个框架,任何媒体文件在你面前都是透明的。

核心要点:
  • ffprobe input.mp4 是最基础的用法,能看到所有信息
  • -v error -show_entries 可以精确控制输出字段
  • -select_streams v:0 只选视频流,a:0 只选音频流
  • 容器格式 ≠ 编码格式,别搞混了
  • 帧率要看 avg_frame_rate,尤其是VFR视频

好了,ffprobe查看媒体信息这块就聊到这儿。这些命令我每天都在用,确实很顺手。你上手之后会发现,它比那些图形界面的媒体信息工具好用多了——快、准、还能集成到脚本里自动化处理。


公众号:蓝海资料掘金营,微信deep3321