实战Golang流媒体:第二部分——回源技术解析

发表时间: 2023-09-08 07:09

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):
https://github.com/zq2599/blog_demos

本篇概览

  • 今天的实战是流传输过程中的常见功能:回源
  • 如下图,lal(源站)和lal(拉流节点)代表两台电脑,上面都部署了lal
  • VLC在播放时去拉流节点拉流,但实际上FFmpeg将流推到了源站,这就要求拉流节点能和源站建立联系,从源站获取到媒体流返回给VLC



  • 至于为什么VLC不直接去源站拉流呢?原因是多方面的:
  1. 网络不通,可能VLC在公网,而源站只能在某个内网
  2. 带宽成本问题,可能源站出口带宽成本比拉流节点出口带宽成本高
  3. 距离问题,有可能FFmpeg和源站都在北方,VLC在南方,走公网去北方拉流距离大所以延时大,如果拉流节点在南方,那么VLC去拉流节点距离就会变短(拉流节点和源站是内网通信)
  • 将FFmpeg改为主播,VLC改为观众,是不是有直播内味了...
  • 捋清楚了上述逻辑,接下来可以动手操作了,从上图可见,今天要部署两个lal,我这边把拉流节点部署在本机MacBook上,源站部署在阿里云上(阿里云专家的福利,一年ECS免费用)
  • 最终的部署情况如下图



源站部署

  • 登录阿里云机器
  • 将编译好的lalserver以及lalserver.conf.json上传到阿里云服务器,目录结构如下图
~# tree lallal├── bin│   └── lalserver├── conf│   └── lalserver.conf.json
  • 注意,我这边MacBook是M1芯片,编译出来的lalserver无法运行在X86架构的电脑上,您也要注意类似问题
  • 启动
./bin/lalserver -c conf/lalserver.conf.json
  • 如果您用的也是云服务器,注意放开1935和8080端口
  • 推流到源站
./ffmpeg \-re \-stream_loop -1 \-i ../videos/sample.mp4 \-c copy \-f flv \'rtmp://源站IP:1935/live/test110'
  • 此时直接从源站拉流是没有问题的,可以用VLC或者ffplay试试
rtmp://源站IP:1935/live/test110

拉流节点配置

  • 接下来要部署拉流节点了,这里要修改配置,使得它在收到拉流请求的时候,知道去哪里拉流
  • 打开配置文件conf/lalserver.conf.json,找到配置static_relay_pull,其原本内容如下
  "static_relay_pull": {    "enable": false,    "addr": ""  },
  • 修改后的内容如下,注意端口就是1935
  "static_relay_pull": {    "enable": true,    "addr": "源站IP:1935"  },
  • 启动
./bin/lalserver -c conf/lalserver.conf.json
  • 用VLC验证,播放地址如下,均可以正常播放,要注意的是hls的无法最先播放,这个应该和拉流的内部处理有关,现在还不熟悉lal的源码,只能留待将来再研究了
rtmp://127.0.0.1:1935/live/test110http://127.0.0.1:8080/live/test110.flvhttp://127.0.0.1:8080/hls/test110.m3u8
  • 播放效果如下,与直接从源站拉流一样,当然了,些许延时还是有的,看实际网络情况



  • 另外还要注意的是:如果VLCl拉的流在拉流节点本来就存在(FFmpeg推到了拉流节点),那么拉流节点就直接返回流给VLC了,不会去源站拉
  • 至此,回源操作就完成了,如果您正好在研究推拉流级联,希望本文能给您一些参考

欢迎关注头条号:程序员欣宸

  • 学习路上,你不孤单,欣宸原创一路相伴...