一、问题描述
最近用ffmpeg推视频流到rtsp服务器上,再从客户端拉rtsp视频流的时候,出现了1s延迟,使用的ffmpeg命令如下:
rtspUrl = 'rtsp://192.168.2.24:8554/main.264'
command = [
'ffmpeg',
# 're',#
# '-y', # 无需询问即可覆盖输出文件
'-f', 'rawvideo', # 强制输入或输出文件格式
'-vcodec', 'rawvideo', # 设置视频编解码器。这是-codec:v的别名
'-pix_fmt', 'bgr24', # 设置像素格式
'-s', '640x480', # 设置图像大小
'-r', '30', # 设置帧率
'-i', '-', # 输入
'-c:v', 'libx264',
'-pix_fmt', 'yuv420p',
'-preset', 'ultrafast',
'-f', 'rtsp', # 强制输入或输出文件格式
rtspUrl]
pipe = sp.Popen(command, stdin=sp.PIPE)
二、解决办法
-preset
参数与编码速度和质量有关,可以优化编码速度和压缩效率之间的权衡
-preset
共有以下几种级别:ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow
,级别越高,编码速度越慢,解码后的质量也就越高,所以要根据我们的需求来定级别,由于我们对视频质量要求不高,对速度的要求比较高,所以我们选择编码速度最快的级别ultrafast
可以看到-preset
参数已经设置为ultrafast
-tune
参数提供了一个zerolatency
选项,可以极大的减小延迟,但是图像质量会明显变差,所以追求低延迟可以再加一个-tune, zerolatency
参数我在使用
zerolatency
的情况下,出现丢帧卡顿的情况,后来我将-r
帧率设置为了15,相当于牺牲了帧率来保证低延迟,不知道有没有更优的办法来保证低延迟
-s
参数是用来设定图像分辨率的,低分辨率要比高分辨率延迟更大,我们在使用ultrafast
和zerolatency
参数的前提下,分辨率设置为640*480
延迟在110ms左右,分辨率设置为1280*720
延迟在270ms左右,rtspUrl = 'rtsp://192.168.2.24:8554/main.264'
command = [
'ffmpeg',
# 're',#
# '-y', # 无需询问即可覆盖输出文件
'-f', 'rawvideo', # 强制输入或输出文件格式
'-vcodec', 'rawvideo', # 设置视频编解码器。这是-codec:v的别名
'-pix_fmt', 'bgr24', # 设置像素格式
'-s', '640x480', # 设置图像大小
'-r', '15', # 设置帧率
'-i', '-', # 输入
'-c:v', 'libx264',
'-pix_fmt', 'yuv420p',
'-preset', 'ultrafast',
'-tune', 'zerolatency',
'-f', 'rtsp', # 强制输入或输出文件格式
rtspUrl]
pipe = sp.Popen(command, stdin=sp.PIPE)