直播系统介绍
时间:2022-07-26
本文章向大家介绍直播系统介绍,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
演示
本地演示:ffmpeg/obs + livego + mpv
- 推流选择ffmpeg或者obs
- 流媒体服务直接使用livego
- 播放使用mpv
推流截图:
拉流截图:
livego
git clone https://github.com/gwuhaolin/livego.git
go build livego.go # 编译
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build livego.go # 编译成linux环境下的可执行文件
./livego
流地址
rtmp推流:rtmp://127.0.0.1:1935/live/taylor
rtmp拉流:rtmp://127.0.0.1:1935/live/taylor
hdl拉流:http://127.0.0.1:7001/live/taylor.flv
hls拉流:http://127.0.0.1:7002/live/taylor.m3u8
如果使用ffmpeg推流
ffmpeg -re -i ~/Documents/Taylor Swift - You Belong With Me.mp4 -c copy -f flv rtmp://localhost:1935/live/taylor
视频流
直播系统组成
直播流协议
RTMP
Rtmp规范1.0:https://suncle.me/2018/03/09/rtmp%E8%A7%84%E8%8C%831-0/
Rtmp规范1.0 en:http://wwwimages.adobe.com/www.adobe.com/content/dam/acom/en/devnet/rtmp/pdf/rtmp_specification_1.0.pdf
- RTMP协议是应用层协议,基于下层的传输层协议TCP
- 要建立一个有效的RTMP Connection链接,首先要握手。但是实际使用过程中对握手数据校验不严格
- Adobe公司
- 低延迟,内容延迟可以低于3秒
- 需要编解码
- 几乎所有的稳定推流协议都是RTMP
HDL
HDL协议中封装格式使用的是FLV,HDL又叫做HTTP-FLV
- 基于HTTP
- 低延迟,内容延迟可以低于3秒
- 需要编解码
HLS
Http Live Streaming。
- 苹果公司
- 基于HTTP
- HTML5可以直接播放,不需要编解码,需要在服务端切片,有Stream Segmenter的概念
- 格式:
- m3u8:索引文件,以m3u8为后缀。用文本方式对媒体文件进行描述,由一系列标签组成
- ts:传输流文件,视频编码主要格式h264/mpeg4,音频为acc/MP3。
- 延迟较高,一般在10秒左右
使用情况
对于正常的直播场景,多数都是推流使用Rtmp协议,拉流使用HLS协议
参考:
- SRS的C++版本:https://github.com/ossrs/srs
- SRS的Golang版本:https://github.com/gwuhaolin/livego
- 云直播系统架构与实施:https://blog.csdn.net/qiansg123/article/details/80124296
- UCloud:http://blog.ucloud.cn/archives/699
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- FreeRTOS内核应用开发手记
- 移植FreeRTOS后运行,卡在uxDeletedTasksWaitingCleanUp
- 99%的人都不知道内网、外网、宽带、带宽、流量、网速之间的区别与联系
- 什么是前缀树--打开了我的新思路
- 一个案例搞懂原码、反码、补码,不懂得请看过来
- 人人都在用,但你却不知道它背后发生了什么——浏览器的工作原理:浏览器幕后揭秘
- 这有一把钥匙,打开MySQL死锁问题!
- 普通人如何全面了解大数据的特点,意义和发展前景
- 面试官问我Linux下常见网络命令
- 最全常用User-Agent
- 聊到JVM(还怕面试官问JVM吗?)
- Android.location.Address类方法获取GPS定位信息
- Python二叉树详解笔记
- 《剑指offer》第七天:二叉树的下一个结点
- 后台登录微信并定时发送消息,消息包括农历、阴历、天气;自动监测是否断线,支持邮箱发送二维码登录;适合于挂在服务器上运行