SRT协议在多路径推流,聚合路由器方案(转载)

2022-07-21 18:00:22 yangquan3 284

winlinvip commented on Sep 27, 2021  

先说最重要的:目前SRS还没有支持聚合路由器,还在捣腾中,敬请期待。。。

现在每周会做一场直播,主要是SRS的答疑,推RTMP流到视频号,发现有时候网络抖动会卡顿。

上行推流如果网络不好,会导致所有人都卡,因此基本上直播都需要保障上行推流,除非是一个网络摄像头24小时推流直播没人看的那种场景。

Solution

目前市面上的方案是聚合路由器,一般是在路由器上插多张网卡,部署一个专用的服务器来聚合这些网卡的流,然后推到直播源站。这里有几个问题:

  1. 这是路由器厂商的方案,完全物理层的多路径传输,其实如果做直播专用的多路径,做应用层的多路径推流,会更简单也可以有更多的业务处理。参考MPTCP

  2. 多路径并没有冗余,如果遇到某个链路质量不好或抖动,需要比较复杂的算法来处理。比如一条链路的RTT从10ms变成100ms,这个链路质量怎么计算,比较复杂,因为从某些包看不到最终的结果,如果采用冗余推流,就可以只看最终这些流的FPS是否正常,选择FPS比较稳定的一路流转推就行。

  3. 一般服务器是路由器厂商部署,自己部署比较麻烦,而且是链路层的服务器。不如部署专用的视频服务器比较直观,比如会有很多视频的指标。

所以我觉得应用层的聚合路由器方案,会更好一些,具体方案参考:架构图

Goal

这是一个开源的聚合路由器方案,主要的目标是:

  • 提供一种开源的聚合路由器方案,实现高可靠的直播推流。

  • 在OpenWRT上使用SRS的一个范例,可以拓展到其他场景,比如企业SRS网关。

  • SRS支持OpenWRT(MIPS)平台,适配ST支持MIPS。

这不是一个商业产品,目标也不是为了产出能直接商业化可售卖的产品,因为真正要做成商业产品,有很多东西要,要考虑很多因素,这也不是开源项目要做的事情。

开源要做的,就是跑通链路,展现出各种可能性。主要任务:

  •  SRS支持OpenWRT,修改ST适配MIPS系统,参考 #2637

  •  SRS支持MPTCP多路径传输。

  •  SRS支持MP- QUIC多路径传输。

HiWifi Y1 + EC20

HiWifi配置不高但到处都是,有一个USB口可以插一个EC20的4G网卡,实现WiFi+4G双通道传输。

首先,将HiWifi Y1刷成OpenWRT系统,参考下面的OpenWRT Install

然后,需要安装USB的4G网卡驱动,Windows是RNDIS,Linux是CDC-ECM,区别参考这里。在OpenWRT中,安装这个就可以:

opkg update
opkg install kmod-usb-net-rndis

接着,重启路由器。将EC20插到USB口,就可以看到识别出来了,有了一个新的网卡叫usb0

root@OpenWrt:~# dmesg[   99.149068] usb 1-1: new high-speed USB device number 2 using ehci-platform
[   99.229163] rndis_host 1-1:1.0 usb0: register 'rndis_host' at usb-101c0000.ehci-1, RNDIS device, fa:50:57:e0:1e:d6

root@OpenWrt:~# ifconfig usb0usb0      Link encap:Ethernet  HWaddr 86:41:4A:15:66:2A  
          BROADCAST MULTICAST  MTU:1500  Metric:1

最后,新增一个网络接口就可以了。

OpenWRT Install

如果官方下载比较慢,可以从国内腾讯清华镜像站点,下载刷机镜像和kmod。

Note: kmod不能使用自己编译的,会报错Cannot satisfy dependencies / kernel is not compatible,必须使用和内核对应的版本和hash号,也就是只能安装不能自己单独编译kmod。注意使用--force-depends --force-checksum也不可以。

刷机镜像,从下载页面选择版本和自己路由器的型号,可以从Targets找到,比如HiWifi Y1是ramips/mt7620,然后在下载页面找到对应品牌比如hiwifi_hc5661的镜像:

可以刷完路由器后,先连上其他WiFi访问网络,就可以用opkg安装了。

首先,备份下官方opkg源,设置为腾讯云镜像:

cp /etc/opkg/distfeeds.conf /etc/opkg/distfeeds.conf.bk-`date +%s`sed -i 's|downloads.openwrt.org|mirrors.cloud.tencent.com/openwrt|g' /etc/opkg/distfeeds.conf

最后,更新和安装就可以:

opkg update
opkg install kmod-usb-net-rndis

说明下其他可能用到的包:

  • kmod-usb-net-cdc-ether:就是USB网卡驱动,CDC ECM模式。安装kmod-usb-net-rndis时默认会安装这个包,具体请查看CDC-ECM 和 RNDIS

  • kmod-usb-serial-option:若需要操作EC20模块,比如AT串口命令操作/dev/ttyUSB2,设置EC20的模式,需要安装这个模块。一般都不需要这个模块的。

  • libstdcpp:这是C++的动态库,如果程序用到了C++就需要安装这个库。

  • libopenssl:这是openssl动态库,加解密需要用到这个库。

  • gdb:可以在OpenWRT上调试程序。

OpenWRT Build

路由器肯定是基于OpenWRT做的,基本上目前路由器都会基于这个开源项目开发。

由于OpenWRT比较庞大,国内下载不是慢就是会失败,我找了一些镜像源加速下载,请参考openwrt-docker

这个Docker是Ubuntu 20的环境,Dockerfile会把OpenWRT的代码以及依赖的feeds的代码下载下来,打出来镜像后,就可以直接配置和编译。后续就可以直接git pull来更新代码,就快很多了。

下载到docker是因为,编译OpenWRT是要在Linux文件系统里面,mac和windows的文件系统不是大小写敏感的。

OpenWRT: srs-server

SRS可以在OpenWRT中运行,参考Build package srs-server

ST(state-threads)支持MIPS,参考#21

启动SRS服务器:

/usr/bin/srs-server -c /etc/srs/conf/openwrt.conf

推流到SRS:

ffmpeg -re -i doc/source.flv -c copy -f flv rtmp://192.168.1.1/live/livestream

观看HTTP-FLV:http://192.168.1.1:8080/live/livestream.flv

image

MPTCP

目前直播聚合路由器,使用的是传输层多路径传输的方案,相关项目如下:

MPTCP是基于TCP的协议,参考下图:

image

下面是架构图:

image

多路径传输主要是提升了传输带宽,顺便提升了抗抖动能力。

这里有个测试方案无线4G的视频传输方案,用3张限速800Kbps的4G网卡,传输2Mbps直播流。注意插拔网卡时,会有秒级别的卡顿和花屏(可能商业产品是能解的)。

MP-QUIC

志宏提到QUIC也有多路径的版本,参考 multipath-quic.org,官方说 quic-go 这个QUIC库就已经支持了。

MP-QUIC比MPTCP,关键的优势我认为有几点:

  1. 应用层协议,不用走非常长的升级链路,App自己写代码就可以用,这样普及速度快了太多太多了。不用动内核,不用动路由器,不用动底层库,在应用层就可以搞定。

  2. UDP协议,天然就容易支持,QUIC本身也考虑过连接迁移,只是没有考虑同时传。从RFC可以看出MP-QUIC才28页,MPTCP有58页。

  3. QUIC是未来互联网的基础,多路径可以应用得远不止TCP这样,所有应用都可以用到。

这个能带来的影响是非常不一样的。又快,又简单,还很广泛。

Commercial Products

目前市场上有不少聚合路由器的产品,主要解决的也是提升传输带宽,当然传输容错也有支持。

  • LiveU Solo, Simultaneously bond up to 4 network links including support for 2x 4G LTE cellular or WiMAX modems, Wifi and Ethernet,支持4个网络并行传输(2个4G、Wi-Fi、有线)。与目睹直播平台、搜狐视频、腾讯视频、微博、微信、Bilibili、优酷土豆等国内主流在线媒体和其它海外主流内容分发网络和在线视频平台兼容。

  • TVU One,Reliably transmits high picture quality video even in congested or challenging environments,Uses patented IS+ transmission algorithm,Support for HDR and 1080P60 encoding at as little as 800kbps,Long internal battery life,HEVC/H.265 video compression,CNCed from high-density aluminum。可动态聚合来自不同网路连接的频宽,包括蜂巢式网路、光纤、卫星、WiFi和以太网。

  • Teradek BondFamily,The Bond Backpack is an all in one professional HEVC/H.264 streaming solution for broadcasters seeking the best in signal reception and video quality. High Gain Antennas,Node Modems,Gold or V Mount Battery Plate,Integrated Locking Cables。

@winlinvip winlinvip added the Discussion Discussion or questions.label on Sep 27, 2021
@winlinvip winlinvip added this to the 5.0 milestone on Sep 27, 2021
@winlinvip winlinvip self-assigned this on Sep 27, 2021
@winlinvip winlinvip changed the title 多路径推流,聚合路由器方案 多路径推流,聚合路由器方案,OpenWRT+MIPS支持 on Sep 30, 2021
@online2311

srs直播聚合路由器那个多线路配置如何配置有一些看不太明白。

@winlinvip winlinvip changed the title 多路径推流,聚合路由器方案,OpenWRT+MIPS支持 开源复刻:多路径推流,聚合路由器方案,OpenWRT+MIPS支持 on Oct 13, 2021
@winlinvip winlinvip added the Solution It's a solution plan.label on Oct 14, 2021
@MattUan

看了你的架构图 大概达到的效果是SRS服务器分流推送然后接收端选择链路最好的一路进行转推?这样的话起到的是冗余的作用 而MPTCP起到的作用是叠加多链路的网速 比如有三条10M宽带 叠加成30M提高可用带宽 看了最新的openmptcprouter的文档 貌似已经添加了热备冗余的功能 具体实现方式还没研究过 总之和你说的方案应该是两个不同的方向 不过把srs集成聚合应该可以有效减少故障点同时降低延迟?

@winlinvip
MemberAuthor

@MattUan 对的,和MPTCP是不同的,如果相同就没有必要做了,直接用MPTCP就挺好的。

我想做的,主要解决的是带宽满足要求时的冗余问题,当然也可以用多个机位实现冗余。

另外,MPQUIC可能比MPTCP更合适,只是还不成熟。


导航
网站首页
产品中心
人才招聘
联系我们