当前位置: 首页 > news >正文

Golang流媒体实战之二:回源

欢迎访问我的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 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了,不会去源站拉
  • 至此,回源操作就完成了,如果您正好在研究推拉流级联,希望本文能给您一些参考

你不孤单,欣宸原创一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 数据库+中间件系列
  6. DevOps系列
http://www.lryc.cn/news/42687.html

相关文章:

  • webgl——给场景添加光
  • Vue实战【Vue项目开发时常见的几个错误】
  • 【多线程】常见的锁策略
  • 如何让虚拟机里的Ubuntu通过连接手机USB数据线上网
  • windows渗透(sam、system文件导出)
  • b01lers(php.galf)
  • 记一次若依后台管理系统渗透
  • Mybatis(四):自定义映射resultMap
  • 机器学习---降维算法
  • 【Vue2从入门到精通】详解Vue.js的15种常用指令及其使用场景
  • 数据库知识总结
  • 处理数组循环中删除元素导致索引错位情况
  • 快速排序,分治法实际应用(含码源与解析)
  • linux入门---操作体统的概念
  • 《Qt 6 C++开发指南》提供4个版本的示例程序
  • chartgpt 告诉我的,loss 函数的各种知识
  • 旅行推销员问题的遗传算法中的完整子路线顺序交叉
  • Python实现词频统计
  • 微信小程序面试题(day08)
  • 最强的Python可视化神器,你有用过么?
  • Ubuntu使用vnc远程桌面【远程内网穿透】
  • 【C++】map、set、multimap、multiset的介绍和使用
  • css学习14(多媒体查询)
  • 【C++进阶】C++11(中)左值引用和右值引用
  • Python中的生成器【generator】总结,看看你掌握了没?
  • MD5加密竟然不安全,应届生表示无法理解?
  • 【Linux】虚拟地址空间
  • 四平方和题解(二分习题)
  • 一篇文章搞定js正则表达式
  • [数据结构] 用两个队列实现栈详解