一、问题描述
最近用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)
