限时福利领取


YUV格式作为视频处理的原始数据载体,直接决定画质处理的灵活性;H.265(HEVC)则是当前主流的高效视频编码标准,能在同等画质下比H.264节省50%码率。本文将带你用FFmpeg完成YUV↔H.265的高效转换,避开常见雷区。

YUV采样示意图

一、为什么需要关注YUV和H.265?

  1. YUV格式优势:相比RGB,YUV分离亮度(Y)和色度(UV)分量,更符合人眼感知特性,支持420/422/444等多种采样格式
  2. H.265价值:采用CTU(Coding Tree Unit)和更复杂的预测算法,特别适合4K/8K等高分辨率场景

二、那些年我们踩过的坑

  • 色偏问题:YUV420p(每4个Y共享1个UV)误用为YUV444p(全采样)时,会导致色彩饱和度异常
  • 马赛克现象:H.265的crf参数(Constant Rate Factor)设置过高(如>28)或preset过快(如ultrafast)时,容易出现块效应

三、手把手实战流程

1. 环境准备(FFmpeg 6.0)

# 编译时需指定--enable-libx265
./configure --enable-gpl --enable-libx265 --enable-shared
make -j8

2. 编码关键参数

ffmpeg -s 1920x1080 -pix_fmt yuv420p -i input.yuv \
  -c:v libx265 -preset medium -x265-params "crf=23:psy-rd=1" \
  output.hevc
- -preset:从ultrafast到veryslow共9档,建议直播用fast,点播用medium - psy-rd:心理视觉优化,提升主观画质(值范围0-2)

3. 安全编码示例(C语言)

AVFrame *frame = av_frame_alloc();
if (!frame) {
  fprintf(stderr, "Failed to allocate frame\n");
  return -1;
}
frame->format = AV_PIX_FMT_YUV420P;
frame->width = 1920;
frame->height = 1080;

// 手动分配内存(注意对齐)
av_frame_get_buffer(frame, 32);

/* 填充YUV数据... */

// 最后必须释放
av_frame_free(&frame); 

四、性能实测对比

| Preset | 耗时(秒) | CPU占用(%) | 输出大小(MB) | |----------|---------|-----------|-------------| | ultrafast| 12.3 | 65 | 48 | | medium | 28.7 | 82 | 32 | | slow | 51.2 | 95 | 29 |

五、避坑指南

  1. 格式兼容:解码时用sws_scale()转换不同YUV格式
    SwsContext *ctx = sws_getContext(/* 源格式 */, /* 目标格式 */);
    sws_scale(ctx, src_data, src_linesize, ...);
  2. 内存防护:重复释放AVPacket会导致段错误
    av_packet_unref(pkt);  // 替代已废弃的av_free_packet

编解码流程

思考题

Q:如何利用Intel QSV或NVIDIA NVENC实现硬件加速?提示:需要编译时开启--enable-opencl--enable-cuvid支持,并在命令行指定-hwaccel参数。

经验分享:在1080P视频处理中,硬件加速可使编码速度提升3-5倍,但需注意驱动兼容性问题。你在实践中遇到过哪些硬件加速的坑?欢迎评论区交流!

Logo

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

更多推荐