使用FFmpeg采集桌面并通过RTP组播传输时帧率无法达到59.94fps的问题求助
FFmpeg采集桌面并通过RTP组播传输时帧率无法达到59.94fps的问题求助
各位大佬好,我现在碰到个头疼的问题:我想采集PC当前的显示画面(比如正在运行的游戏),然后通过RTP组播以rawvideo格式、yuv422p10的10位色深、59.94fps的帧率传输出去。
目前我用的命令行是这样的:
ffmpeg -f gdigrab -framerate 60000/1001 -i desktop ^ -c:v rawvideo -pix_fmt yuv422p10 -b:v 5M ^ -f rtp -r 60000/1001 -sdp_file stream.sdp rtp://224.1.1.1:5004
但不管怎么调参数,实际输出的帧率只能卡在37~39fps,死活上不去59.94。想问问大家,这是FFmpeg本身处理不了这么高的负载,还是我的命令参数哪里设置错了?
针对你的问题,我结合经验梳理了几个可能的原因和解决方向:
1. 先排查硬件和系统资源瓶颈
- 采集环节的性能限制:gdigrab采集桌面本身就吃CPU/GPU性能,尤其是游戏画面是高动态、高分辨率的场景,再加上yuv422p10是10位色深,数据量比普通8位格式大了不少。你可以先单独测试本地采集,去掉RTP传输部分,看看能不能跑满帧率:
如果本地录制都达不到59.94fps,那基本就是你的硬件(CPU/GPU)扛不住这么大的采集+格式转换负载了——哪怕是rawvideo,从桌面的RGB格式转成yuv422p10也需要算力。ffmpeg -f gdigrab -framerate 60000/1001 -i desktop -c:v rawvideo -pix_fmt yuv422p10 test.raw - 系统资源冲突:打开任务管理器看看FFmpeg的CPU、内存占用,如果已经接近100%,那肯定是资源不够用了。另外游戏本身也会占大量资源,两者叠加下来帧率自然上不去。
2. 修正FFmpeg命令里的参数问题
- 重复设置帧率没必要:你的命令里既给输入的gdigrab设了
-framerate 60000/1001,又给输出的RTP设了-r 60000/1001,其实输入端的帧率设置已经足够,输出端的-r反而可能导致FFmpeg做额外的帧率转换处理,建议去掉输出的-r参数,让它直接沿用输入的帧率。 - 码率设置严重不合理:你设的
-b:v 5M对于yuv422p10的59.94fps画面来说实在太低了。举个例子,1080P分辨率下,yuv422p10的原始码率大概是1920*1080*10*2*59.94/8/1024/1024 ≈ 300Mbps,你设的5M连零头都不到,FFmpeg只能通过丢帧来压缩码率,这直接导致帧率掉下来。rawvideo不需要码率控制,建议直接去掉-b:v参数,让它用原始数据量传输。
3. 其他优化小技巧
- 降低采集分辨率:如果硬件性能确实跟不上,可以试试用
-video_size 1280x720降低采集分辨率,减少数据量,看看帧率能不能上去。 - 换用硬件加速的采集方式:gdigrab是Windows上的基础采集工具,你可以试试dshow采集,或者如果有NVIDIA显卡的话,用NVENC相关的采集方案,硬件加速能大幅减轻CPU的负担。
- 排除网络影响:组播传输如果网络带宽不够或者有丢包,FFmpeg也可能会降帧适配。你可以先测试本地回环传输(比如把RTP地址设成127.0.0.1),看看帧率是否正常,先排除网络的问题。
备注:内容来源于stack exchange,提问作者NoobCoder
相关产品推荐
相关产品推荐

