6月1日 23:25

FFmpeg 怎么查看视频信息?ffprobe 命令和视频质量分析实战

获取视频信息用 ffprobe(FFmpeg 自带的探测工具),不需要转码,秒出结果。分析视频质量用 PSNR/SSIM 等指标,对比编码前后的画质差异。

ffprobe:一行命令看透视频

最常用的命令:

bash
# 查看所有信息(人类可读) ffprobe input.mp4 # JSON 格式输出(方便脚本解析) ffprobe -v quiet -print_format json -show_format -show_streams input.mp4

日常只需要几个关键字段:

字段含义查看命令
分辨率视频宽高ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 input.mp4
时长视频长度(秒)ffprobe -v error -show_entries format=duration -of csv=p=0 input.mp4
码率比特率ffprobe -v error -show_entries format=bit_rate -of csv=p=0 input.mp4
帧率每秒帧数ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of csv=p=0 input.mp4
编码器编解码格式ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of csv=p=0 input.mp4

这些命令看着长,但本质都是 -show_entries 指定要哪个字段 + -of 指定输出格式。记住模式就行,不用背命令。

提取关键信息的快捷脚本

bash
# 一行获取:分辨率 帧率 编码 时长 码率 ffprobe -v error -select_streams v:0 \ -show_entries stream=width,height,codec_name,r_frame_rate \ -show_entries format=duration,bit_rate \ -of default=noprint_wrappers=1 input.mp4

在 Python 里调用 ffprobe:

python
import subprocess, json def get_video_info(path): cmd = ["ffprobe", "-v", "quiet", "-print_format", "json", "-show_format", "-show_streams", path] result = subprocess.run(cmd, capture_output=True, text=True) return json.loads(result.stdout) info = get_video_info("input.mp4") video = info["streams"][0] # 第一个视频流 print(f"分辨率: {video["width"]}x{video["height"]}") print(f"编码: {video["codec_name"]}") print(f"时长: {float(info["format"]["duration"]):.1f}秒")

视频质量分析:量化编码损失

压缩视频后想知道画质损失了多少,用 PSNR 和 SSIM 两个指标。

PSNR(峰值信噪比):数值越高画质越好,30dB 以下明显有损,40dB 以上视觉无损。

bash
ffmpeg -i original.mp4 -i compressed.mp4 -lavfi psnr -f null -

SSIM(结构相似度):0-1 之间,越接近 1 越相似。SSIM 比 PSNR 更接近人眼感知——PSNR 只看像素差异,SSIM 看结构变化。实际评估画质优先看 SSIM。

bash
ffmpeg -i original.mp4 -i compressed.mp4 -lavfi ssim -f null -

两个命令都会逐帧计算并输出平均值。VMAF 是 Netflix 提出的更先进的质量指标,更接近人类主观评分,但 FFmpeg 原生不支持(需要额外编译 libvmaf)。

常见问题排查

视频打不开:先跑 ffprobe input.mp4,看报错信息。常见原因:文件损坏、编码不支持、容器格式错误。ffprobe 比任何播放器都能更快定位问题。

码率异常:如果视频文件很大但画质一般,用 ffprobe 看码率——可能是编码效率低(用了老编码器)或码率设置过高。转成 H.264/265 + 合理 CRF 通常能大幅缩小。

音视频不同步:ffprobe 看 start_time 差异——音频和视频的起始时间不一致就会导致不同步。

标签:FFmpeg