限时福利领取


YUV格式基础与H.265编码

在音视频处理中,YUV是一种常见的颜色编码方式,与RGB相比更适用于视频压缩。YUV将亮度信息(Y)与色度信息(UV)分离存储,通过减少色度采样(如YUV420)可显著降低数据量。

YUV采样示意图

常见YUV采样格式:

  • YUV444:无压缩,每个Y/U/V分量完整存储
  • YUV422:水平方向色度减半
  • YUV420:水平和垂直方向色度均减半(最常用)

直接处理YUV数据的挑战

  1. 色彩空间转换:不同设备采集的YUV可能使用不同标准(如BT.601/BT.709)
  2. 内存对齐:YUV数据需按特定步长(stride)对齐,否则会出现锯齿或花屏
  3. 分辨率适配:非标准分辨率需手动填充(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参数优化指南

  1. CRF值
  2. 18-22:视觉无损(文件较大)
  3. 23-28:常规使用
  4. 28:明显质量下降

  5. Preset选择

  6. ultrafast:速度最快,压缩率最低
  7. medium:默认平衡点
  8. slower:高质量但速度慢

避坑指南

  • 帧率不匹配:检查输入输出的time_base是否一致
  • 色彩失真:确认pix_fmt参数与源文件匹配
  • 内存泄漏:始终调用av_free()释放FFmpeg对象
  • 分辨率错误:确保宽度是色度分量的整数倍(YUV420需宽度/2为整数)

思考与实践

如何评估质量损失?推荐方法:

  1. 计算PSNR/SSIM指标
  2. ffplay直观对比原始与解码后的YUV
  3. 尝试不同CRF值(如18/23/28)观察文件大小与画质变化

建议动手实验:用同一段YUV测试不同preset参数,记录编码时间和文件大小变化曲线。

Logo

音视频技术社区,一个全球开发者共同探讨、分享、学习音视频技术的平台,加入我们,与全球开发者一起创造更加优秀的音视频产品!

更多推荐