ffmpeg 以 30fps 的速度将流媒体传输到 rtmp

ffmpeg 以 30fps 的速度将流媒体传输到 rtmp

我正在尝试使用屏幕捕获记录器将我的桌面流式传输到 Facebook rtmp 服务器:

ffmpeg -re -rtbufsize 256M -f dshow -i audio="Mikrofon (Realtek Audio)" 
-rtbufsize 256M -f dshow -i audio="virtual-audio-capturer"  
-rtbufsize 1024M -f dshow -i video=screen-capture-recorder -r 30  
-filter:v scale=1280:720 -c:v  h264_nvenc -pix_fmt yuv420p -preset fast 
-b:v 8M -maxrate:v 10M  -c:a aac -b:a 128k -ar 44100 
-f flv rtmp://live-api.facebook.com:80/rtmp/..............

我使用 h264_nvenc 编解码器进行 gpu 加速,但我只能以 12-18 fps 的速度流式传输到 rtmp。但是,当我流式传输到文件时:

ffmpeg -re  -rtbufsize 256M -f dshow -i audio="Mikrofon (Realtek Audio)" 
-rtbufsize 256M -f dshow -i audio="virtual-audio-capturer"  
-rtbufsize 1024M -f dshow -i video=screen-capture-recorder -r 30  
-filter:v scale=1280:720 -c:v  h264_nvenc -pix_fmt yuv420p -preset fast 
-b:v 8M -maxrate:v 10M  -c:a aac -b:a 128k -ar 44100 
D:\test.mp4 -y

即使在玩游戏时(例如《使命召唤 6》,非常耗硬件),我也能毫无问题地获得 30 fps。

此外,当流式传输(到 rtmp)开始时,过了一会儿我仍不断收到此错误,尽管我的 -rtbufsize 大小为 1024M,我认为这相当大,但许多帧都丢失了:

real-time buffer too full or near too full! frame dropped!

您能帮助我如何避免 rtbufsize 错误吗?是否可以修改我的命令以便我可以以 30 fps 的速度流式传输到 rtmp?谢谢

如果需要,我的 ffmpeg 构建配置是:

ffmpeg 版本 3.3.3 版权所有 (c) 2000-2017 FFmpeg 开发人员使用 gcc 7.1.0(GCC)构建配置:--disable-static --enable-shared --enable-gpl --enable-version3 --enable-cuda --enable-cuvid --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --启用-libopencore-amrwb --启用-libopenh264 --启用-libopenjpeg --启用-libopus --启用-librtmp --启用-libsnappy --启用-libsoxr --启用-libspeex --启用-libtheora --启用-libtwolame --启用-libvidstab --启用-libvo-amrwbenc --启用-libvorbis --启用-libvpx --启用-libwavpack --启用-libwebp --启用-libx264 --启用-libx265 --启用-libxavs --启用-libxvid --启用-libzimg --启用-lzma --启用-zlib

答案1

首先,我会丢失-rtbufsize每个输入的个体。如果 ffmpeg 滞后,增加实时缓冲区不会有帮助,除非您试图补救偶尔出现的峰值。我不确定 ffmpeg 在 Windows 上保留了多少余量,但我认为可以安全地假设,如果您在将输出帧速率设置为 30 的情况下获得 12fps,它永远不会赶上。它基本上记录了多达 1GB 的屏幕截图以供稍后编码,充当缓冲可能需要一分钟,甚至更短的时间才会丢帧。

你说你可以毫无问题地以 30fps 的速度保存文件,所以这可能是上传到 Facebook 的速度。所以基本上你必须把输出缩小一点。

我很确定 ffmpeg 默认将所有输入读取为 25fps,因此将输出设置为 25fps 而不是 30fps 可能会免费将您的 fps 提高到 20 以上。不过我不确定 dshow 是如何工作的,所以如果您真的想要 30fps,我可能错了。

我刚刚注意到你-b:v 8M为编码器设置了...这对你的互联网连接来说现实吗?许多 ISP 会限制其住宅用户的上传速度,因此你可能无法达到超过 3-4mbps 的速度,尤其是当你想进行直播时。

您想使用-preset=slowmedium打算使用预设。硬件编码器可能会有所不同,因此您可能需要检查其选项,但由于网络速度是瓶颈,如果您想要实时流式传输,您能做的不多,视频必须更小,无论是帧速率、分辨率还是压缩。

相关内容