一、概述
不管是实时互动、直播、点播、还是离线渲染等场景都需要对视频文件进行编解码。且不同的应用场景对编解码的速度以及质量也是不同的,那么如何平衡速度与质量的关系以及选取合适的
应用场景就成为了关键。本节就简单介绍一下AVCodecContext->pre_data的预设参数的用法,来更好的视线视频质量速度的平衡。
二、示例
- 控制编码速度与压缩效率的平衡
AVCodecContext *c;
av_opt_set(c->priv_data, "preset", "ultrafast", 0);
key:preset 从ultrafast~veryslow 编码速度越来越慢,相应的视频压缩率也越来越高。
| 预设值 | 编码速度 | 压缩效率 | 文件大小 | 编码时间 | 推荐场景 |
ultrafast |
最快 |
最差 |
最大 |
最短 |
实时直播、低延迟场景 |
superfast |
很快 |
较差 |
较大 |
很短 |
实时处理、临时文件 |
veryfast |
快 |
一般 |
适中 |
短 |
在线视频、快速转码 |
fast |
较快 |
较好 |
较小 |
中 |
标准转码、平衡选择 |
medium |
中等 |
良好 |
中等 |
中 |
默认预设(无特殊需求) |
slow |
较慢 |
优秀 |
小 |
长 |
离线渲染、存储空间有限 |
slower |
慢 |
更优 |
更小 |
很长 |
高质量归档、不考虑时间 |
- ultrafast
- superfast
- veryfast
- faster
- fast
- medium
- slow
- slower
- veryslow
- 应用场景
- 直播、视频会议、实时互动可以使用ultrafast、superfast、veryfast,这样编码速度更快,可以把视频尽快传递出去(ps:虽然加大了一定的码率)
- 本地视频存储/编辑/播放:使用slow、slower、veryslow可以有更好的压缩率,节省存储空间
- 针对特定场景优化编码参数,从film~zerolatency,编码延迟从高到底。根据自己场景的需要进行选择,如直播选择zerolatency(最小化编码延迟)
- key:tune
- film
- 作用:优化电影、实拍视频的编码效果。
- 效果:
- 增强细节保留(如人脸、纹理)。
- 调整去块滤波器,减少块状效应。
- 启用更精细的运动估计(适合复杂场景)。
- 适用场景:电影、纪录片、剧情片等实拍内容
- animation
- 作用:优化动画、卡通的编码效果。
- 效果:
- 保留锐利边缘(如线条画)。
- 减少颜色渐变的条带效应。
- 降低运动估计精度(动画运动通常较规律)。
- 适用场景:动漫、2D/3D 动画、游戏过场动画。
- grain
- 作用:保留胶片颗粒或噪点。
- 效果:
- 避免降噪算法模糊颗粒感。
- 优化噪点区域的码率分配。
- 适用场景:电影胶片转码、复古风格视频、高 ISO 拍摄的素材。
- stillimage
- 作用:优化静态图像或变化较少的场景。
- 效果:
- 增加 I 帧密度(减少 P/B 帧)。
- 提高静止区域的压缩效率。
- 适用场景:幻灯片、演示视频、监控录像。
- psnr
- 作用:针对 PSNR(峰值信噪比)或 SSIM(结构相似性)指标优化。
- 效果:
- 优先减少客观量化误差(PSNR)或保持结构相似性(SSIM)。
- 注意:高 PSNR/SSIM 不直接等同于视觉质量更好,仅用于算法对比。
- 适用场景:编码器性能测试、画质对比实验。
- ssim(同上)
- fastdecode
- 作用:优化解码器性能,降低解码复杂度。
- 效果:
- 禁用复杂的解码特性(如高级运动补偿)。
- 减少内存占用和 CPU 使用率。
- 适用场景:低性能设备(如机顶盒、老旧手机)播放的视频。
- zerolatency
- 作用:最小化编码延迟,适合实时场景。
- 效果:
- 禁用 B 帧(双向预测帧),仅使用 I/P 帧。
- 减少编码缓存(Lookahead)。
- 可能降低压缩效率(文件变大)。
- 适用场景:直播、视频会议、实时监控。
-
- CRF 模式:
- 值范围:18-28(默认 23),越小画质越好。
- 用法:
av_opt_set(c->priv_data, "crf", "20", 0)
- 场景:输出文件大小不限时,优先使用 CRF(质量恒定)。
- 固定码率 (CBR):
- 用法
av_opt_set(c->priv_data, "bitrate", "2000k", 0); // 2Mbps
av_opt_set(c->priv_data, "rc-lookahead", "60", 0); // 前瞻帧数