Qt+ffmpeg将录屏画面推流到RTSPServer遇到的画面花屏卡顿的问题及优化
Qt+ffmpeg将录屏画面推流到RTSPServer遇到的画面花屏卡顿的问题及优化
项目地址:https://gitee.com/lizhi_zizi/screen-record
https://gitee.com/lizhi_zizi/rtspserver_test2
Qt程序调用的ffmpeg命令行进行录屏推流到RTSPServer,如下:
args << "-f" << "gdigrab"
<< "-framerate" << "30"
<< "-i" << "desktop"
<< "-c:v" << "libx264"
<< "-preset" << "ultrafast"
<< "-tune" << "zerolatency"
<< "-pix_fmt" << "yuv420p"
<< "-rtsp_transport" << "udp"
<< "-f" << "rtsp"
<< m_rtspUrl;
1.发现在RTSPSever接收推流数据保存的文件,打开画面有花屏、卡顿不流畅的问题。
单独调用ffmpeg命令测试保存的文件,其文件打开画面正常,调用如下:
ffmpeg -f gdigrab -i desktop -vcodec libx264 -pix_fmt yuv420p output.h264
确定是参数-preset ultrafast和-tune zerolatency导致的画面花屏卡顿。
前者通过降低压缩率提升编码速度,后者减少缓冲延迟,两者协同实现低延迟实时流传输。基础命令未指定这些参数,默认使用中等编码速度和延迟。
2.程序中去除参数-preset ultrafast和-tune zerolatency,如下:
args << "-f" << "gdigrab"
<< "-framerate" << "30"
<< "-i" << "desktop"
<< "-c:v" << "libx264"
<< "-pix_fmt" << "yuv420p"
<< "-rtsp_transport" << "udp"
<< "-f" << "rtsp"
<< m_rtspUrl;
验证结果,服务器接收到保存的文件打开没有花屏,但是还是有画面不流畅的问题。
其主要与H.264编码的延迟优化机制缺失有关。
编码效率与流畅性关系
默认编码模式
未指定-preset时,FFmpeg默认使用medium预设,该模式以编码效率优先,会增加帧处理延迟(约增加2-3倍编码时间),导致实时流传输时帧间隔不均匀
低延迟优化缺失
-tune zerolatency的作用是禁用帧重排序(B帧减少)和降低缓冲大小,移除后会导致编码器累积更多帧再处理,加剧网络传输的卡顿感
这里采用“平衡参数调整”方案,如下
-preset veryfast // 比medium快但保留部分压缩效率
-tune fastdecode // 替代zerolatency,减少B帧但不完全禁用
-x264-params ref=3:bframes=1 // 限制参考帧和B帧数量
3.采用“平衡参数调整”方案后,如下:
args << "-f" << "gdigrab"
<< "-framerate" << "30"
<< "-i" << "desktop"
<< "-c:v" << "libx264"
<< "-preset" << "veryfast"
<< "-tune" << "fastdecode"
<< "-x264-params" << "ref=3:bframes=1"
<< "-pix_fmt" << "yuv420p"
<< "-rtsp_transport" << "udp"
<< "-f" << "rtsp"
<< m_rtspUrl;
验证结果,推流保存的文件打开没有画面,对保存的.264文件进行nal分析发现,缺少IDR帧。
其原因是,使用-x264-params ref=3:bframes=1参数时,可能会因为B帧和参考帧的限制导致IDR帧间隔过长,影响视频流的可解码性和实时性。
“显式设置关键帧间隔”方案
使用keyint/min-keyint组合,例如keyint=30:min-keyint=15,确保低延迟下的定期关键帧。
-x264-params ref=3:bframes=1:keyint=60:min-keyint=30
3.采用“平衡参数调整”方案后,如下:
args << "-f" << "gdigrab"
<< "-framerate" << "30"
<< "-i" << "desktop"
<< "-c:v" << "libx264"
<< "-preset" << "veryfast"
<< "-tune" << "fastdecode"
<< "-x264-params" << "ref=3:bframes=1:keyint=60:min-keyint=30"
<< "-pix_fmt" << "yuv420p"
<< "-rtsp_transport" << "udp"
<< "-f" << "rtsp"
<< m_rtspUrl;
验证结果,推流保存的文件打开画面正常

浙公网安备 33010602011771号