FFmpeg实战:YUV数据编码为H.265文件并解码回YUV的完整指南
·
YUV格式基础与H.265编码
在音视频处理中,YUV是一种常见的颜色编码方式,与RGB相比更适用于视频压缩。YUV将亮度信息(Y)与色度信息(UV)分离存储,通过减少色度采样(如YUV420)可显著降低数据量。

常见YUV采样格式:
- YUV444:无压缩,每个Y/U/V分量完整存储
- YUV422:水平方向色度减半
- YUV420:水平和垂直方向色度均减半(最常用)
直接处理YUV数据的挑战
- 色彩空间转换:不同设备采集的YUV可能使用不同标准(如BT.601/BT.709)
- 内存对齐:YUV数据需按特定步长(stride)对齐,否则会出现锯齿或花屏
- 分辨率适配:非标准分辨率需手动填充(padding)到编解码器支持的值
FFmpeg命令行实战
YUV转H.265编码
ffmpeg -s 1920x1080 -pix_fmt yuv420p -i input.yuv \
-c:v libx265 -preset fast -crf 23 output.hevc
关键参数说明:
-preset fast:平衡编码速度与压缩率-crf 23:质量因子(18-28为常用范围)
H.265解码回YUV
ffmpeg -i output.hevc -pix_fmt yuv420p decoded.yuv
C语言API实现(核心代码片段)
// 初始化编码器
AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_HEVC);
AVCodecContext *cctx = avcodec_alloc_context3(codec);
cctx->width = 1920;
cctx->height = 1080;
cctx->pix_fmt = AV_PIX_FMT_YUV420P;
cctx->time_base = (AVRational){1, 25}; // 25fps
// 设置H.265参数
av_opt_set(cctx->priv_data, "preset", "fast", 0);
av_opt_set(cctx->priv_data, "crf", "23", 0);

H.265参数优化指南
- CRF值:
- 18-22:视觉无损(文件较大)
- 23-28:常规使用
-
28:明显质量下降
-
Preset选择:
- ultrafast:速度最快,压缩率最低
- medium:默认平衡点
- slower:高质量但速度慢
避坑指南
- 帧率不匹配:检查输入输出的time_base是否一致
- 色彩失真:确认pix_fmt参数与源文件匹配
- 内存泄漏:始终调用av_free()释放FFmpeg对象
- 分辨率错误:确保宽度是色度分量的整数倍(YUV420需宽度/2为整数)
思考与实践
如何评估质量损失?推荐方法:
- 计算PSNR/SSIM指标
- 用
ffplay直观对比原始与解码后的YUV - 尝试不同CRF值(如18/23/28)观察文件大小与画质变化
建议动手实验:用同一段YUV测试不同preset参数,记录编码时间和文件大小变化曲线。
更多推荐


所有评论(0)