FFmpeg超低延迟视频推流笔记

FFmpeg超低延迟视频推流笔记

云游戏平台推流和普通直播平台最大不同有两点,一个是码率,我们希望用户能尽可能用低的网络体验好的效果,毕竟玩的人是自己,还有一点就是延迟了,普通直播延迟5秒左右都属于正常,通常降低到1秒左右就属于超低延迟了,而我们的要求是降低到50毫秒以下,中间遇到了不少坑,记录一下。
音频延迟可以参考我的另一篇:
注:编码CPU为i7-9750H,GPU为1660Ti,所有驱动都更新为最新版本,目前通过测试发现不同的驱动版本,以及硬件,会有不同的编码效果,以下编码只保证上述平台有效。其他平台未详细测试

FFmpeg RTP 100ms以下超低音频流推送设置

https://blog.csdn.net/weixin_44259356/article/details/102698197
原文:https://blog.csdn.net/weixin_44259356/article/details/103287477

libx264软编设置

首先可以通过指令查看编码支持的参数配置,libx264官网也有文档,写的比较详细也可以看官网,指令如下:

ffmpeg -h encoder=libx264

正常软编推流主要有两个问题,第一当画面不动时播放端流容易中断,第二延迟高。1080p,30帧,关键帧间隔30时,设置如下:

tune=zerolatency sc_threshold=499 profile=high preset=ultrafast

这是obs视频额外编码设置格式,正常使用ffmpeg推流则是如下格式:

-tune zerolatency -sc_threshold 499 -profile high -preset ultrafast

tune

设置编码方式为零延迟,还有其他的编码方式,比如电影,动画等,具体可以通过上面命令查看,这里不多赘述除了解决问题以外的参数,这个参数引入后能极大的降低延迟,但是画面容易不稳定,容易播放中断。

sc_threshold

设置场景更改检测的阈值,主要是作用与当画面运动时额外的数据记录。值越高画面会越流畅,但是相同码率下画面会变模糊,值过低运动时画面会出现卡顿,499为测试调整的值,不同的其他配置可以测试调整。

profile

设置编码画质基本为high,主要有三个档次Baseline,Main,High。级别越高,画质越好,编码开销越大,另外高级别的编码有些低级设备可能会出现无法支持解码播放的问题。这里为了画面效果选择high。

preset

调整编码预设等级,主要有:ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow,placebo。
和profile一样等级越高画面质量越好,但是编码越慢,这里设置为最低,如果不设置为最低,在零延迟编码下windows OBS会出现当画面为全黑,推流视频无法播放的问题,linux obs貌似没有这个问题,这里不涉及linux所有配置全是windows下。

效果:

1080p 30帧 6000码率下延迟能降低到12毫秒左右。
FFmpeg超低延迟视频推流笔记_第1张图片

h264_nvenc硬编设置

硬编和软编相比,在更低的码率下能有更好的推流效果,但是延迟会更高。设置如下:

preset=llhq profile=high level=4 rc=vbr_hq zerolatency=1 coder=auto

ffmpeg命令行设置参考上面软编。

preset

llhq为硬编特有,低延迟高质量编码

level

设置编码约束等级,1080p 30帧用4.0刚刚好,再往上就得提高等级最高为5.1,支持4k30帧,

rc

设置编码码率方式,vbr_hq为可变,高质量编码。另外还有cbr恒定码率等方式

zerolatency

设置启用零延迟编码,默认为false,这里设置为1或者true都行,tune为软编特有参数。zerolatency为硬编设置,实测能降低几毫秒延迟左右不少特别大。

coder

设置编码类型,这里自动选择就好。

效果:

FFmpeg超低延迟视频推流笔记_第2张图片
延迟29毫秒,比软编延迟差不多大了三倍,但是同样的效果需要得码率也只有软编的三分之一。另外我用的gpu是1660Ti,nvenc官网说用2060以上gpu效果会更好,目前显卡还没到,没测试过,

最后

还有个nvenc_h264编码,不过我看命令行提示以及被弃用了,此外还测试过vp8,vp9,h265等编码,vp8效果不好,vp9编码太慢,h265,webrtc目前不支持,等原因这里不采用。

你可能感兴趣的:(FFmpeg,云游戏平台学习开发记录)