FFmpeg 提供了强大的工具来获取和分析视频文件的详细信息,这对于视频处理和质量评估非常重要。
使用 ffprobe 获取视频信息
基本信息查看
bash# 查看文件基本信息 ffprobe input.mp4 # 显示更详细的信息 ffprobe -v quiet -print_format json -show_format -show_streams input.mp4 # 只显示视频流信息 ffprobe -v quiet -select_streams v -show_entries stream input.mp4 # 只显示音频流信息 ffprobe -v quiet -select_streams a -show_entries stream input.mp4
格式化输出
bash# JSON 格式输出 ffprobe -v quiet -print_format json -show_format -show_streams input.mp4 # XML 格式输出 ffprobe -v quiet -print_format xml -show_format -show_streams input.mp4 # CSV 格式输出 ffprobe -v quiet -print_format csv -show_entries stream=codec_name,width,height input.mp4 # 平面文本格式 ffprobe -v quiet -print_format flat -show_format -show_streams input.mp4
获取特定信息
视频分辨率
bash# 获取视频分辨率 ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of default=noprint_wrappers=1:nokey=1 input.mp4 # 获取视频宽度 ffprobe -v error -select_streams v:0 -show_entries stream=width -of default=noprint_wrappers=1:nokey=1 input.mp4 # 获取视频高度 ffprobe -v error -select_streams v:0 -show_entries stream=height -of default=noprint_wrappers=1:nokey=1 input.mp4
视频帧率
bash# 获取视频帧率 ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of default=noprint_wrappers=1:nokey=1 input.mp4 # 获取平均帧率 ffprobe -v error -select_streams v:0 -show_entries stream=avg_frame_rate -of default=noprint_wrappers=1:nokey=1 input.mp4
视频时长
bash# 获取视频时长(秒) ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4 # 获取视频时长(时:分:秒) ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1 input.mp4 | awk '{print int($1/3600)":"int(($1%3600)/60)":"int($1%60)}' # 获取视频时长(帧数) ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=noprint_wrappers=1:nokey=1 input.mp4
视频比特率
bash# 获取视频比特率 ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1:nokey=1 input.mp4 # 获取总体比特率 ffprobe -v error -show_entries format=bit_rate -of default=noprint_wrappers=1:nokey=1 input.mp4
视频编码器
bash# 获取视频编码器 ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 input.mp4 # 获取视频编码器描述 ffprobe -v error -select_streams v:0 -show_entries stream=codec_long_name -of default=noprint_wrappers=1:nokey=1 input.mp4
音频信息
bash# 获取音频采样率 ffprobe -v error -select_streams a:0 -show_entries stream=sample_rate -of default=noprint_wrappers=1:nokey=1 input.mp4 # 获取音频声道数 ffprobe -v error -select_streams a:0 -show_entries stream=channels -of default=noprint_wrappers=1:nokey=1 input.mp4 # 获取音频编码器 ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 input.mp4
视频质量分析
PSNR(峰值信噪比)
bash# 计算两个视频的 PSNR ffmpeg -i original.mp4 -i compressed.mp4 -lavfi psnr -f null - # 显示详细的 PSNR 信息 ffmpeg -i original.mp4 -i compressed.mp4 -lavfi "psnr=stats_file=psnr.log" -f null -
SSIM(结构相似性)
bash# 计算两个视频的 SSIM ffmpeg -i original.mp4 -i compressed.mp4 -lavfi ssim -f null - # 显示详细的 SSIM 信息 ffmpeg -i original.mp4 -i compressed.mp4 -lavfi "ssim=stats_file=ssim.log" -f null -
VMAF(视频多方法评估融合)
bash# 计算 VMAF 分数(需要 libvmaf) ffmpeg -i original.mp4 -i compressed.mp4 -lavfi "libvmaf=model_path=vmaf_v0.6.1.pkl" -f null - # 生成 VMAF 报告 ffmpeg -i original.mp4 -i compressed.mp4 -lavfi "libvmaf=model_path=vmaf_v0.6.1.pkl:log_path=vmaf.log" -f null -
视频帧分析
提取帧信息
bash# 显示每一帧的信息 ffprobe -v quiet -select_streams v:0 -show_frames input.mp4 # 显示帧类型(I/P/B 帧) ffprobe -v quiet -select_streams v:0 -show_entries frame=pict_type -of default=noprint_wrappers=1:nokey=1 input.mp4 # 统计帧类型 ffprobe -v quiet -select_streams v:0 -show_entries frame=pict_type -of csv=p=0 input.mp4 | sort | uniq -c
GOP 分析
bash# 显示 GOP 结构 ffprobe -v quiet -select_streams v:0 -show_entries frame=pict_type,pts_time input.mp4 # 计算 GOP 大小 ffprobe -v quiet -select_streams v:0 -show_entries frame=pict_type -of csv=p=0 input.mp4 | grep -c "^I"
音频分析
音频波形分析
bash# 生成音频波形图 ffmpeg -i input.mp3 -lavfi "showwavespic=s=640x320" waveform.png # 生成音频频谱图 ffmpeg -i input.mp3 -lavfi showspectrumpic=s=640x320 spectrum.png # 生成音频视频 ffmpeg -i input.mp3 -lavfi "showwaves=s=640x320" output.mp4
音频音量分析
bash# 分析音频音量 ffmpeg -i input.mp3 -af "volumedetect" -f null - # 归一化音频 ffmpeg -i input.mp3 -af "loudnorm" output.mp3
文件信息分析
文件大小
bash# 获取文件大小 ls -lh input.mp4 # 使用 ffprobe 获取文件大小 ffprobe -v error -show_entries format=size -of default=noprint_wrappers=1:nokey=1 input.mp4
容器格式
bash# 获取容器格式 ffprobe -v error -show_entries format=format_name -of default=noprint_wrappers=1:nokey=1 input.mp4 # 获取容器格式描述 ffprobe -v error -show_entries format=format_long_name -of default=noprint_wrappers=1:nokey=1 input.mp4
实用脚本
完整视频信息脚本
bash#!/bin/bash file=$1 echo "=== Video Information ===" echo "Resolution: $(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of default=noprint_wrappers=1:nokey=1 "$file")" echo "Frame Rate: $(ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of default=noprint_wrappers=1:nokey=1 "$file")" echo "Duration: $(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file") seconds" echo "Video Codec: $(ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 "$file")" echo "Bitrate: $(ffprobe -v error -show_entries format=bit_rate -of default=noprint_wrappers=1:nokey=1 "$file") bps" echo "" echo "=== Audio Information ===" echo "Audio Codec: $(ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 "$file")" echo "Sample Rate: $(ffprobe -v error -select_streams a:0 -show_entries stream=sample_rate -of default=noprint_wrappers=1:nokey=1 "$file") Hz" echo "Channels: $(ffprobe -v error -select_streams a:0 -show_entries stream=channels -of default=noprint_wrappers=1:nokey=1 "$file")"
批量分析脚本
bash#!/bin/bash for file in *.mp4; do echo "Analyzing: $file" duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file") resolution=$(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of default=noprint_wrappers=1:nokey=1 "$file") echo "Duration: ${duration}s, Resolution: $resolution" echo "" done
最佳实践
- 使用适当的输出格式:根据需要选择 JSON、XML 或平面文本
- 过滤不必要的信息:使用
-select_streams和-show_entries减少输出 - 静默模式:使用
-v quiet或-v error减少噪音输出 - 批量处理:结合脚本批量分析多个文件
- 质量评估:使用 PSNR、SSIM、VMAF 等工具评估视频质量
获取和分析视频信息是视频处理的重要步骤,可以帮助你了解视频特性并选择合适的处理参数。