Clone
25
v2_CN_LowLatency
winlin edited this page 2022-01-06 11:57:15 +08:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

HOME > CN > Realtime

低延时直播应用

直播应用中RTMP和HLS基本上可以覆盖所有客户端观看参考DeliveryHLSHLS主要是延时比较大RTMP主要优势在于延时低。

低延迟的部署实例参考:Usage: Realtime

应用场景

低延时应用场景包括:

  • 互动式直播譬如2013年大行其道的美女主播游戏直播等等各种主播流媒体分发给用户观看。用户可以文字聊天和主播互动。
  • 视频会议SRS的DEMO就有视频会议应用我们要是有同事出差在外地就用这个视频会议开内部会议。其实会议1秒延时无所谓因为人家讲完话后其他人需要思考思考的延时也会在1秒左右。当然如果用视频会议吵架就不行。
  • 其他监控直播也有些地方需要对延迟有要求互联网上RTMP协议的延迟基本上能够满足要求。

RTMP和延时

RTMP的特点如下

  • Adobe支持得很好RTMP实际上是现在编码器输出的工业标准协议基本上所有的编码器摄像头之类都支持RTMP输出。原因在于PC市场巨大PC主要是WindowsWindows的浏览器基本上都支持flashFlash又支持RTMP支持得灰常好。
  • 适合长时间播放因为RTMP支持的很完善所以能做到flash播放RTMP流长时间不断流当时测试是100万秒即10天多可以连续播放。对于商用流媒体应用客户端的稳定性当然也是必须的否则最终用户看不了还怎么玩我就知道有个教育客户最初使用播放器播放http流需要播放不同的文件结果就总出问题如果换成服务器端将不同的文件转换成RTMP流客户端就可以一直播放该客户走RTMP方案后经过CDN分发没听说客户端出问题了。
  • 延迟较低比起YY的那种UDP私有协议RTMP算延迟大的延迟在1-3秒比起HTTP流的延时一般在10秒以上RTMP算低延时。一般的直播应用只要不是电话类对话的那种要求RTMP延迟是可以接受的。在一般的视频会议参考SRS的视频会议延时应用中RTMP延时也能接受原因是别人在说话的时候我们一般在听实际上1秒延时没有关系我们也要思考话说有些人的CPU处理速度还没有这么快
  • 有累积延迟技术一定要知道弱点RTMP有个弱点就是累积误差原因是RTMP基于TCP不会丢包。所以当网络状态差时服务器会将包缓存起来导致累积的延迟待网络状况好了就一起发给客户端。这个的对策就是当客户端的缓冲区很大就断开重连。当然SRS也提供配置。

HLS低延时

主要有人老是问这个问题如何降低HLS延迟。

HLS解决延时就像是爬到枫树上去捉鱼奇怪的是还有人喊看那有鱼。你说是怎么回事。

我只能说你在参与谦哥的魔术表演,错觉罢了。

如果你真的确信有,请用实际测量的图片来展示出来,参考下面延迟的测量。

RTMP延迟的测量

如何测量延时,是个很难的问题,不过有个行之有效的方法,就是用手机的秒表,可以比较精确的对比延时。参考:RTMP延时测量

经过测量发现,在网络状况良好时:

  • RTMP延时可以做到0.8秒左右SRS也可以
  • 多级边缘节点不会影响延迟和SRS同源的某CDN的边缘服务器可以做到
  • Nginx-Rtmp延迟有点大估计是缓存的处理多进程通信导致
  • GOP是个硬指标不过SRS可以关闭GOP的cache来避免这个影响参考后面的配置方法。
  • 服务器性能太低,也会导致延迟变大,服务器来不及发送数据。
  • 客户端的缓冲区长度也影响延迟。譬如flash客户端的NetStream.bufferTime设置为10秒那么延迟至少10秒以上。

Min-Latency

当开启最低延迟配置后SRS会禁用mr(merged-read)并且在consumer队列中使用超时等待大约每收到1-2个视频包就发送给客户端达到最低延迟目标。

测试vp6纯视频流能达到0.1秒延迟,参考#257。配置文件:

vhost mrw.srs.com {
    # whether enable min delay mode for vhost.
    # for min latence mode:
    # 1. disable the mr for vhost.
    # 2. use timeout for cond wait for consumer queue.
    # @see https://github.com/ossrs/srs/issues/257
    # default: on
    min_latency     off;
}

部署低延时的实例,参考:[wiki](EN, CN).

Merged-Read

RTMP的Read效率非常低需要先读一个字节判断是哪个chunk然后读取header接着读取payload。因此上行支持的流的路数大约只有下行的1/3譬如SRS1.0支持下行2700上行只有1000SRS2.0支持下行10000上行只有4500。

为了提高性能SRS对于上行的read使用merged-read即SRS在读写时一次读取N毫秒的数据这个可以配置

# the MR(merged-read) setting for publisher.
vhost mrw.srs.com {
    # about MR, read https://github.com/ossrs/srs/issues/241
    mr {
        # whether enable the MR(merged-read)
        # default: off
        enabled     on;
        # the latency in ms for MR(merged-read),
        # the performance+ when latency+, and memory+,
        #       memory(buffer) = latency * kbps / 8
        # for example, latency=500ms, kbps=3000kbps, each publish connection will consume
        #       memory = 500 * 3000 / 8 = 187500B = 183KB
        # when there are 2500 publisher, the total memory of SRS atleast:
        #       183KB * 2500 = 446MB
        # the value recomment is [300, 2000]
        # default: 350
        latency     350;
    }
}

也就是说当开启merged-read之后服务器的接收缓冲区至少会有latency毫秒的数据延迟也就会有这么多毫秒。

若需要低延迟配置关闭merged-read服务器每次收到1个包就会解析。

Merged-Write

SRS永远使用Merged-Write即一次发送N毫秒的包给客户端。这个算法可以将RTMP下行的效率提升5倍左右SRS1.0每次writev一个packet支持2700客户端SRS2.0一次writev多个packet支持10000客户端。

用户可以配置merged-write一次写入的包的数目建议不做修改

# the MW(merged-write) settings for player.
vhost mrw.srs.com {
    # set the MW(merged-write) latency in ms. 
    # SRS always set mw on, so we just set the latency value.
    # the latency of stream >= mw_latency + mr_latency
    # the value recomment is [300, 1800]
    # default: 350
    mw_latency      350;
}

若需要极低延迟损失较多性能可以设置为100毫秒SRS大约一次发送几个包。

GOP-Cache

什么是GOP就是视频流中两个I帧的时间距离如果问什么是I帧就去百度。

GOP有什么影响Flash解码器只有拿到GOP才能开始解码播放。也就是说服务器一般先给一个I帧给Flash。可惜问题来了假设GOP是10秒也就是每隔10秒才有关键帧如果用户在第5秒时开始播放会怎么样

第一种方案等待下一个I帧也就是说再等5秒才开始给客户端数据。这样延迟就很低了总是实时的流。问题是等待的这5秒会黑屏现象就是播放器卡在那里什么也没有有些用户可能以为死掉了就会刷新页面。总之某些客户会认为等待关键帧是个不可饶恕的错误延时有什么关系我就希望能快速启动和播放视频最好打开就能放

第二种方案马上开始放放什么呢你肯定知道了放前一个I帧。也就是说服务器需要总是cache一个gop这样客户端上来就从前一个I帧开始播放就可以快速启动了。问题是延迟自然就大了。

有没有好的方案?有!至少有两种:

  • 编码器调低GOP譬如0.5秒一个GOP这样延迟也很低也不用等待。坏处是编码器压缩率会降低图像质量没有那么好。
  • 服务器提供配置可以选择前面两个方案之一SRS就这么做有个gop_cache配置项on就会马上播放off就低延迟。

SRS的配置项

# the listen ports, split by space.
listen              1935;
vhost __defaultVhost__ {
    # whether cache the last gop.
    # if on, cache the last gop and dispatch to client,
    #   to enable fast startup for client, client play immediately.
    # if off, send the latest media data to client,
    #   client need to wait for the next Iframe to decode and show the video.
    # set to off if requires min delay;
    # set to on if requires client fast startup.
    # default: on
    gop_cache       on;
}

备注参考conf/full.conf的min.delay.com配置。

累积延迟

除了GOP-Cache还有一个有关系就是累积延迟。SRS可以配置直播队列的长度服务器会将数据放在直播队列中如果超过这个长度就清空到最后一个I帧

    # the max live queue length in seconds.
    # if the messages in the queue exceed the max length, 
    # drop the old whole gop.
    # default: 30
    queue_length    10;

当然这个不能配置太小譬如GOP是1秒queue_length是1秒这样会导致有1秒数据就清空会导致跳跃。

有更好的方法有的。延迟基本上就等于客户端的缓冲区长度因为延迟大多由于网络带宽低服务器缓存后一起发给客户端现象就是客户端的缓冲区变大了譬如NetStream.BufferLength=5秒那么说明缓冲区中至少有5秒数据。

处理累积延迟的最好方法,是客户端检测到缓冲区有很多数据了,如果可以的话,就重连服务器。当然如果网络一直不好,那就没有办法了。

低延时配置

考虑GOP-Cache和累积延迟推荐的低延时配置如下参考min.delay.com

# the listen ports, split by space.
listen              1935;
vhost __defaultVhost__ {
    gop_cache       off;
    queue_length    10;
    min_latency     on;
    mr {
        enabled     off;
    }
    mw_latency      100;
    tcp_nodelay     on;
}

当然服务器的性能也要考虑不可以让一个SRS进程跑太高带宽一般CPU在80%以下不会影响延迟,连接数参考性能

实测

SRS: 0.9.55

编码器FMLE, video(h264, profile=baseline, level=3.1, keyframe-frequency=5seconds), fps=15, input=640x480, output(500kbps, 640x480), 无音频输出FMLE的音频切片HLS有问题

网络推流为PC在北京公司内网观看为PC北京公司内网服务器为阿里云青岛节点。

服务器配置:

listen              1935;
vhost __defaultVhost__ {
    enabled         on;
    gop_cache       off;
    hls {
        enabled         on;
        hls_path        ./objs/nginx/html;
        hls_fragment    5;
        hls_window      20;
    }
}

结论RTMP延迟2秒HLS延迟24秒。

参考:RTMP-HLS-latency

Edge实测

SRS集群不会增加延迟。这个是Edge模式比ingest要高级的地方ingest需要启动进程延迟会大。ingest主要适配多种协议也可以主动从源站采集流但Edge是专业的边缘模式。

参考:Edge-latency

Winlin 2014.12