You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FFmpeg录制OpenGL渲染视频画质远低于实时渲染画面的问题咨询

画质下降的核心原因
  • CRF压缩等级过高:你当前使用的-crf 21属于中等压缩等级,Constant Rate Factor(CRF)数值越大压缩率越高、画质损失越明显。线框、锐利边缘这类高频细节对压缩损失非常敏感,21的参数不足以保留这类画面的清晰度。
  • 编码预设速度过快:-preset fast为了提升编码速度,会跳过很多帧内、帧间的压缩优化步骤,同等CRF参数下画质比慢速预设差很多。
  • 无明确帧率指定:当前命令没有设置输入帧率,FFmpeg默认使用25fps采样,如果你的渲染帧率高于25,会出现帧丢弃、画面抖动的问题,间接影响主观画质。
修复方案

1. 修改FFmpeg编码命令

替换你代码里的FFmpeg启动命令为以下版本即可大幅提升画质:

const char* cmd = "ffmpeg -f rawvideo -pix_fmt rgba -s 500x500 -r 60 -i - "
"-c:v libx264 -threads 0 -preset slow -y -pix_fmt yuv420p -crf 17 -x264-params psy-rd=1.0:aq-mode=3 -vf vflip output.mp4";

参数调整说明:

  • 新增-r 60:指定输入帧率为60,匹配OpenGL常规渲染帧率,你可以根据自己的实际渲染帧率修改数值
  • crf从21下调到17:这个区间的画质视觉上几乎无损,文件大小仅会适度提升
  • preset从fast改为slow:编码速度变慢但画质更好,离线导出场景完全可以接受
  • 新增-x264-params psy-rd=1.0:aq-mode=3:优化锐利边缘、线框这类高频细节的保留,减少边缘模糊、块效应

2. 调整帧读取逻辑(可选优化)

你当前的glReadPixels调用在glfwSwapBuffers之后,部分平台驱动下读取前台缓冲可能出现画面撕裂、内容不同步的问题,建议把帧读取和写入FFmpeg的逻辑移动到glfwSwapBuffers之前,渲染完所有内容后直接读取后台缓冲,确保获取的帧内容完整准确:

// 原有渲染逻辑不变,所有draw调用完成后先写FFmpeg,再交换缓冲
/****** ffmpeg *****/
glReadPixels(0, 0, SCR_WIDTH, SCR_HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
fwrite(buffer, sizeof(int)*SCR_WIDTH*SCR_HEIGHT, 1, ffmpeg);
frameCounter++;
/****** end: ffmpeg *****/

glfwSwapBuffers(window);
glfwPollEvents();

如果需要完全无损的导出,可以把CRF值设置为0,导出的H.264视频为无损编码,画质和原始OpenGL帧完全一致,缺点是文件体积会大很多,适合短片段导出场景。

内容的提问来源于stack exchange,提问作者jie chen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 00:06:05