如何使用ffprobe获取视频分辨率:从基础命令到批量处理

无论是为不同设备适配视频、批量分类媒体库,还是进行视频转码,获取准确的视频分辨率都是基础且关键的第一步。FFmpeg工具集中的ffprobe就像一把精准的测量尺,能快速解析媒体文件元数据,无需解码整个视频就能提取宽高信息,让你的视频处理工作流更高效。

使用ffprobe获取视频各项属性与元数据不同,本文将专注于分辨率获取的深度技巧,包括基础命令、参数解析、批量处理以及特殊场景下的分辨率计算。

分辨率获取原理 🔍

ffprobe通过解析媒体文件的容器格式(如MP4、MKV、AVI等)来提取流信息(streams),而无需对整个视频进行解码,这使得它非常高效。视频文件通常包含多种流:视频流、音频流、字幕流等。

要获取分辨率,ffprobe的工作流程是:

  1. 识别文件中的所有流类型
  2. 定位视频流(通常是第一个视频流,标记为v:0
  3. 从视频流的元数据中提取width(宽度)和height(高度)参数
  4. 根据需要格式化输出结果

这种非解码方式不仅速度快,还能处理损坏或部分下载的视频文件。

快速上手:基础命令 ⚡

获取单个视频文件分辨率的最简命令:

ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 input.mp4

参数解析

输出示例

1920x1080

这个命令会直接返回视频的分辨率,格式为宽度x高度,非常适合在脚本中使用。

进阶应用:分辨率获取技巧 🚀

1. JSON格式输出(便于程序处理)

对于需要在程序中处理结果的场景,JSON格式输出更加结构化,便于解析:

ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of json input.mp4

输出:

{
    "programs": [],
    "streams": [
        {
            "width": 1920,
            "height": 1080
        }
    ]
}

2. 获取宽高比信息

除了基础分辨率,有时我们还需要知道视频的宽高比(aspect ratio):

ffprobe -v error -select_streams v:0 -show_entries stream=width,height,sample_aspect_ratio -of json input.mp4

输出示例:

{
    "programs": [],
    "streams": [
        {
            "width": 1920,
            "height": 1080,
            "sample_aspect_ratio": "1:1"
        }
    ]
}

3. 处理包含多个视频流的文件

某些容器格式(如MKV)可能包含多个视频流,可通过指定流索引获取特定流的分辨率:

# 获取第二个视频流的分辨率
ffprobe -v error -select_streams v:1 -show_entries stream=width,height -of csv=s=x:p=0 input.mkv

3. 批量获取多个文件分辨率

在处理大量视频文件时,批量操作可以节省大量时间:

# 批量处理当前目录下的所有MP4文件
for file in *.mp4; do
    resolution=$(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 "$file")
    echo "$file: $resolution"
done

# 将结果保存到文件
for file in *.mp4; do
    resolution=$(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 "$file")
    echo "$file,$resolution" >> video_resolutions.csv
done

4. Windows系统下的批量处理

Windows用户可以使用PowerShell实现类似功能:

Get-ChildItem -Filter *.mp4 | ForEach-Object {
    $resolution = ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 $_.FullName
    Write-Output "$($_.Name): $resolution"
}

常见问题与解决方案 ❓

Q: 命令执行后无输出或报错?

A: 可能原因及解决方法:

Q: 如何获取旋转后的实际显示分辨率?

A: 手机或相机拍摄的视频可能包含旋转元数据(通常为90°、180°或270°),这时需要结合rotate参数判断实际显示分辨率:

ffprobe -v error -select_streams v:0 -show_entries stream=width,height,rotate -of csv=s=x:p=0 input.mp4

如果输出包含旋转角度(如1920x1080x90),则实际显示分辨率为1080x1920(高度和宽度互换)。

Q: 如何区分存储分辨率和显示分辨率?

A: 存储分辨率是视频文件中实际编码的像素数(width×height),而显示分辨率可能因宽高比、旋转或缩放而不同。使用以下命令可以同时获取这两种信息:

ffprobe -v error -select_streams v:0 -show_entries stream=width,height,display_aspect_ratio,rotate -of json input.mp4

Q: 如何批量处理不同格式的视频文件?

A: 可以扩展bash脚本,使用通配符处理多种格式的视频文件:

# 批量处理当前目录下的所有视频文件
for file in *.{mp4,mkv,avi,mov}; do
    if [ -f "$file" ]; then
        resolution=$(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 "$file")
        echo "$file: $resolution"
    fi
done

Q: 如何获取其他视频信息(如帧率、编码格式)?

A: 只需扩展-show_entries参数即可:

# 获取分辨率、帧率和编码格式
ffprobe -v error -select_streams v:0 -show_entries stream=width,height,r_frame_rate,codec_name -of csv=s=x:p=0 input.mp4

操作速查 📋

这里整理了本文介绍的核心命令,方便快速查找使用:

功能命令
获取基础分辨率ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 input.mp4
JSON格式输出ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of json input.mp4
获取宽高比信息ffprobe -v error -select_streams v:0 -show_entries stream=width,height,sample_aspect_ratio -of json input.mp4
获取特定视频流分辨率ffprobe -v error -select_streams v:1 -show_entries stream=width,height -of csv=s=x:p=0 input.mkv
检查旋转角度ffprobe -v error -select_streams v:0 -show_entries stream=width,height,rotate -of csv=s=x:p=0 input.mp4
获取存储与显示分辨率信息ffprobe -v error -select_streams v:0 -show_entries stream=width,height,display_aspect_ratio,rotate -of json input.mp4
获取更多视频信息ffprobe -v error -select_streams v:0 -show_entries stream=width,height,r_frame_rate,codec_name -of csv=s=x:p=0 input.mp4

相关文章 📚