一、问题描述

最近用ffmpeg推视频流到rtsp服务器上,再从客户端拉rtsp视频流的时候,出现了1s延迟,使用的ffmpeg命令如下:

  1. rtspUrl = 'rtsp://192.168.2.24:8554/main.264'
  2. command = [
  3. 'ffmpeg',
  4. # 're',#
  5. # '-y', # 无需询问即可覆盖输出文件
  6. '-f', 'rawvideo', # 强制输入或输出文件格式
  7. '-vcodec', 'rawvideo', # 设置视频编解码器。这是-codec:v的别名
  8. '-pix_fmt', 'bgr24', # 设置像素格式
  9. '-s', '640x480', # 设置图像大小
  10. '-r', '30', # 设置帧率
  11. '-i', '-', # 输入
  12. '-c:v', 'libx264',
  13. '-pix_fmt', 'yuv420p',
  14. '-preset', 'ultrafast',
  15. '-f', 'rtsp', # 强制输入或输出文件格式
  16. rtspUrl]
  17. pipe = sp.Popen(command, stdin=sp.PIPE)

二、解决办法

  1. -preset参数与编码速度和质量有关,可以优化编码速度和压缩效率之间的权衡

-preset共有以下几种级别:ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow,级别越高,编码速度越慢,解码后的质量也就越高,所以要根据我们的需求来定级别,由于我们对视频质量要求不高,对速度的要求比较高,所以我们选择编码速度最快的级别ultrafast
可以看到-preset参数已经设置为ultrafast

  1. -tune参数提供了一个zerolatency选项,可以极大的减小延迟,但是图像质量会明显变差,所以追求低延迟可以再加一个-tune, zerolatency参数

    我在使用zerolatency的情况下,出现丢帧卡顿的情况,后来我将-r帧率设置为了15,相当于牺牲了帧率来保证低延迟,不知道有没有更优的办法来保证低延迟

  1. -s参数是用来设定图像分辨率的,低分辨率要比高分辨率延迟更大,我们在使用ultrafastzerolatency参数的前提下,分辨率设置为640*480延迟在110ms左右,分辨率设置为1280*720延迟在270ms左右,
    1. rtspUrl = 'rtsp://192.168.2.24:8554/main.264'
    2. command = [
    3. 'ffmpeg',
    4. # 're',#
    5. # '-y', # 无需询问即可覆盖输出文件
    6. '-f', 'rawvideo', # 强制输入或输出文件格式
    7. '-vcodec', 'rawvideo', # 设置视频编解码器。这是-codec:v的别名
    8. '-pix_fmt', 'bgr24', # 设置像素格式
    9. '-s', '640x480', # 设置图像大小
    10. '-r', '15', # 设置帧率
    11. '-i', '-', # 输入
    12. '-c:v', 'libx264',
    13. '-pix_fmt', 'yuv420p',
    14. '-preset', 'ultrafast',
    15. '-tune', 'zerolatency',
    16. '-f', 'rtsp', # 强制输入或输出文件格式
    17. rtspUrl]
    18. pipe = sp.Popen(command, stdin=sp.PIPE)

三、其他

https://zhuanlan.zhihu.com/p/22663282