欢迎访问我的GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
- 今天的实战是流传输过程中的常见功能:回源
- 如下图,lal(源站)和lal(拉流节点)代表两台电脑,上面都部署了lal
- VLC在播放时去拉流节点拉流,但实际上FFmpeg将流推到了源站,这就要求拉流节点能和源站建立联系,从源站获取到媒体流返回给VLC
- 至于为什么VLC不直接去源站拉流呢?原因是多方面的:
- 网络不通,可能VLC在公网,而源站只能在某个内网
- 带宽成本问题,可能源站出口带宽成本比拉流节点出口带宽成本高
- 距离问题,有可能FFmpeg和源站都在北方,VLC在南方,走公网去北方拉流距离大所以延时大,如果拉流节点在南方,那么VLC去拉流节点距离就会变短(拉流节点和源站是内网通信)
- 将FFmpeg改为主播,VLC改为观众,是不是有直播内味了…
- 捋清楚了上述逻辑,接下来可以动手操作了,从上图可见,今天要部署两个lal,我这边把拉流节点部署在本机MacBook上,源站部署在阿里云上(阿里云专家的福利,一年ECS免费用)
- 最终的部署情况如下图
源站部署
- 登录阿里云机器
- 将编译好的lalserver以及lalserver.conf.json上传到阿里云服务器,目录结构如下图
~# tree lal
lal
├── 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/test110
http://127.0.0.1:8080/live/test110.flv
http://127.0.0.1:8080/hls/test110.m3u8
- 播放效果如下,与直接从源站拉流一样,当然了,些许延时还是有的,看实际网络情况
- 另外还要注意的是:如果VLCl拉的流在拉流节点本来就存在(FFmpeg推到了拉流节点),那么拉流节点就直接返回流给VLC了,不会去源站拉
- 至此,回源操作就完成了,如果您正好在研究推拉流级联,希望本文能给您一些参考
你不孤单,欣宸原创一路相伴
- Java系列
- Spring系列
- Docker系列
- kubernetes系列
- 数据库+中间件系列
- DevOps系列