GOP
概念
GOP(图像组)是视频编码中一组帧的集合(按相关性分组),它从一个关键帧(I帧)开始,后面跟随若干个参考帧(P帧)和预测帧(B帧)。其结构决定了视频帧的压缩和还原方式。
常见帧类型:
帧类型 | 全称 | 作用 |
---|---|---|
I帧 | Intra Frame(帧内编码帧) | 自包含图像,解码时不依赖其他帧,画质最好,体积最大 |
P帧 | Predicted Frame(向前预测帧) | 依赖前面的 I/P 帧进行预测编码,体积较小 |
B帧 | Bi-directional Predicted Frame(双向预测帧) | 同时参考前后的 I/P/B 帧,压缩效率最高,但对解码延迟影响最大 |
GOP的结构
一个 GOP 的典型结构例子如下:
css
I B B P B B P B B I ...
这个结构表示:
- 每个 GOP 以一个 I 帧开始
- 中间穿插 P 帧和 B 帧
- B 帧依赖前后的帧(会造成解码延迟)
- GOP 结束前会插入下一个 I 帧
GOP的长度
指的是两个 I 帧之间的帧数,比如:
- GOP=30,表示每隔 30 帧出现一个 I 帧
- 通常情况下:GOP = 帧率(FPS) × I帧间隔秒数
例如 30 FPS,每 1 秒一个 I 帧,则 GOP = 30
GOP 配置举例:
GOP 设置 | 描述 |
---|---|
GOP=1 | 全部都是 I 帧,压缩率低,质量高,适合编辑 |
GOP=30 | 典型结构,用于直播、流媒体 |
GOP=60 | 压缩更高,但 seek(快进快退)效率变差 |
GOP 的影响因素
视频压缩率
- GOP 越大,I 帧越少,压缩率越高,但 seek 不方便
- GOP 越小,I 帧多,码率高,质量好,容易快速定位
视频延迟
- B 帧数量多时,必须缓存多帧进行解码 → 增加延迟
- 实时音视频场景(如直播、视频通话)一般使用 无 B 帧结构(IBP or IP)
视频质量
- I 帧质量决定场景变化的清晰度
- 高频场景(如运动、切换画面)建议缩短 GOP
应用建议
场景 | 建议 GOP 结构 | 原因 |
---|---|---|
实时通话 | IP 或 IPPP(无B帧) | 降低延迟,提高实时性 |
直播 | IBBPBBP(GOP=30) | 平衡压缩和延迟 |
视频点播(VOD) | IBBPBBP(GOP=60+) | 压缩效率优先 |
安全监控录像 | GOP=50~100 | 存储成本低,偶尔 seek |
编辑剪辑 | GOP=1(全I帧) | 精确编辑,易于剪切 |
常见问题
GOP越大越好吗?
不一定。虽然压缩率高,但可能带来 seek 慢、画质下降、延迟增加等问题。
如何查看视频的GOP结构?
可以使用 ffprobe
命令(来自 FFmpeg):
bash
ffprobe -show_frames video.mp4
H264压缩比
压缩比
H.264 的压缩比并不是一个固定的值,它取决于多种因素,例如分辨率、帧率、GOP 结构、码率控制方式、场景复杂度等。但可以给出一个大致范围:
编码标准 | 压缩比(与未压缩 YUV 原始数据相比) |
---|---|
未压缩(原始 YUV) | 1:1(参考基准) |
MPEG-2 | 约 1:10 ~ 1:20 |
H.264 | 约 1:30 ~ 1:100+ |
H.265 | 约 1:50 ~ 1:200(比 H.264 高约 50% 压缩效率) |
示例(以 1080p@30fps 为例)
原始 YUV(YUV420p)数据大小:
yaml
分辨率 = 1920 x 1080
帧率 = 30 fps
YUV420 每帧字节数 ≈ 宽 × 高 × 1.5 = 1920×1080×1.5 ≈ 3MB
每秒原始数据 ≈ 3MB × 30 ≈ 90MB
使用 H.264 编码后的典型码率情况:
场景类型 | 常见码率 | 估算压缩比 |
---|---|---|
视频通话 | 500 Kbps | 约 1:144 |
网络直播 | 2~4 Mbps | 约 1:30~1:60 |
高清录像(本地存储) | 4~10 Mbps | 约 1:10~1:20 |
高清点播(VOD) | 1.5~5 Mbps | 约 1:18~1:60 |
影响 H.264 压缩比的主要因素
因素 | 影响说明 |
---|---|
分辨率 | 越高分辨率数据越大,相同码率下压缩更强烈,画质可能下降 |
帧率 | 帧数越多,运动预测开销越大 |
GOP 长度 | GOP 越长(I 帧越少),压缩率越高,但 seek 较差 |
B 帧数量 | 增加 B 帧可以提升压缩效率 |
场景复杂度 | 画面静态压缩率高,运动画面压缩率低 |
码率控制方式 | CBR 固定码率,压缩波动小;VBR/CRF 可变压缩比更高但画质波动 |
编码器质量预设 | 编码速度和压缩效率成反比,比如 x264 的 ultrafast vs slow |
实际编码压缩建议
使用 FFmpeg 设置压缩比(以 CRF 模式为例):
bash
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset slow output.mp4
crf
:压缩质量控制,范围是 0(无损)到 51(最差)。默认推荐 23preset
:编码速度,ultrafast, superfast, veryfast, fast, medium, slow, slower, veryslow
(越慢压缩比越高)
示例压缩效果对比(x264 编码):
CRF | 平均码率 | 画质评价 | 估算压缩比 |
---|---|---|---|
18 | 高 | 接近无损 | 1:30 |
23 | 中 | 良好 | 1:50~1:70 |
28 | 低 | 可接受 | 1:80~1:100+ |