如何用ffmpeg查看视频编码格式和码率?

如何用ffmpeg查看视频编码格式和码率?

一、FFmpeg与ffprobe在视频编码分析中的深度应用

1. 基础命令:使用ffmpeg -i查看视频信息

在多媒体处理中,最基础的命令是:

ffmpeg -i input.mp4

该命令会输出详细的媒体文件元数据。例如,输出片段可能如下:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':

Duration: 00:05:23.45, start: 0.000000, bitrate: 4876 kb/s

Stream #0:0(und): Video: h264 (High), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 4500 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc

Stream #0:1(eng): Audio: aac (LC), 48000 Hz, stereo, fltp, 128 kb/s

codec_name:对应“Video: h264”中的 h264pix_fmt:来自 yuv420pbitrate:全局码率为 4876 kb/s,视频流为 4500 kb/s

然而,这种输出方式冗长且不易解析,尤其在批量处理时效率低下。

2. 深入解析:关键字段定位方法

从 ffmpeg -i 的输出中提取关键信息需关注以下结构:

字段名位置示例说明codec_nameVideo: h264编码标准(H.264/H.265等)pix_fmtyuv420p像素格式,影响兼容性bitrate4500 kb/s比特率,决定画质与体积width/height1920x1080分辨率fps29.97帧率duration00:05:23.45总时长

注意:tbr(time base rate)常被用作估算帧率,而 bitrate: N/A 表示未嵌入码率信息。

3. 码率缺失(N/A)时的实际码率估算

当视频容器未记录码率或为可变码率(VBR)时,bitrate 显示为“N/A”。此时可通过以下公式估算:

实际码率 ≈ (文件大小 × 8) / 时长(秒)

示例计算过程:

获取文件大小:假设为 180 MB = 180 × 8 = 1440 Mb获取时长:通过 ffprobe 提取为 323.45 秒计算码率:1440 / 323.45 ≈ 4.45 Mbps = 4450 kb/s

此方法适用于 MKV、AVI 等常见封装格式中码率缺失的情况。

4. 结构化输出:使用ffprobe实现JSON格式分析

为提升批量处理效率,推荐使用 ffprobe 输出结构化数据:

ffprobe -v quiet -print_format json -show_streams -show_format input.mp4

输出示例如下:

{

"streams": [

{

"index": 0,

"codec_name": "h264",

"codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",

"pix_fmt": "yuv420p",

"width": 1920,

"height": 1080,

"r_frame_rate": "30000/1001",

"bit_rate": "4500000",

"duration": "323.45"

}

],

"format": {

"filename": "input.mp4",

"format_name": "mov,mp4,m4a,3gp,3g2,mj2",

"duration": "323.45",

"size": "189000000"

}

}

可通过脚本自动提取所需字段,如 Python 中使用 json.load() 解析。

5. 批量分析脚本示例

结合 shell 脚本与 ffprobe 实现目录内所有视频的编码分析:

#!/bin/bash

for file in *.mp4 *.mkv; do

echo "Processing $file"

ffprobe -v quiet -print_format json -show_streams "$file" | \

python3 -c "

import sys, json

data = json.load(sys.stdin)

for s in data['streams']:

if s['codec_type'] == 'video':

print(f'{file}|{s.get(\"codec_name\")}|{s.get(\"pix_fmt\")}|{s.get(\"bit_rate\", \"N/A\")}|{s[\"duration\"]}')

"

输出结果可重定向至 CSV 文件,便于后续统计分析。

6. 高级技巧:Mermaid流程图展示分析逻辑

graph TD

A[输入视频文件] --> B{是否支持ffprobe?}

B -- 是 --> C[执行ffprobe JSON输出]

B -- 否 --> D[使用ffmpeg -i捕获文本]

C --> E[解析codec_name/pix_fmt/bitrate]

D --> F[正则匹配关键字段]

E --> G{bitrate为N/A?}

F --> G

G -- 是 --> H[根据文件大小和时长估算]

G -- 否 --> I[直接采用元数据]

H --> J[输出结构化报告]

I --> J

该流程图清晰展示了从原始文件到最终码率输出的完整路径。

风雨相关