golang流媒体服务简介
# 简介
提示
纯Golang开发的流媒体(直播音视频网络传输)服务器。目前已支持RTMP, RTSP(RTP/RTCP), HLS, HTTP[S]/WebSocket-FLV/TS, GB28181协议。并支持通过插件形式进行二次开发扩展。
Note: 分布式部署,多节点架构,适用于大多数场景。
# 特性
- 支持linux/macOS/windows多系统开发、调试、运行
- 支持多arch运行。比如amd64/arm64/arm32/ppc64le/mipsle/s390x
- 支持交叉编译。可在任一平台编译出其他平台的可执行文件
- 运行无依赖。可执行文件无任何环境、库安装依赖,可单文件独立运行
- 提供各平台可执行文件,可免编译直接运行(前提是开放全部源码哈)
- 支持docker。支持amd和arm架构
- 高性能。多核多线程扩展,支持高并发,性能和同类型c/c++开发服务处于同一水平
- 高可用。完善的单元测试。并且有多个线上环境应用
- 多种直播流封装协议
- 支持RTMP, RTSP(RTP/RTCP), HLS, HTTP[S]/WebSocket-FLV/TS, GB28181
- 支持不同封装协议间相互转换
- 支持通过插件形式进行二次开发,支持扩展自定义协议,输入输出都可以
- 多种编码格式。视频支持H264/AVC,H265/HEVC,音频支持AAC, G711A/G711U, OPUS
- 多种格式录制。支持FLV,长MPEGTS,HLS录制(HLS直播与录制可同时开启)
- HTTPS。支持HTTPS-FLV,HTTPS-TS,HLS over HTTPS拉流
- WebSocket。支持Websocket-FLV,WebSocket-TS拉流
- TLS/SSL。所有协议都支持相应的TLS/SSL加密传输。比如RTMPS,RTSPS,HTTPS,WebSockets
- HLS。支持LIVE实时直播、VOD全列表直播。切片文件支持多种删除方式。支持内存切片。支持统计HLS播放者数量
- RTSP。支持over TCP(interleaved模式)。支持basic/digest auth验证。支持461。
- RTMP。支持给单视频添加静音音频数据,支持合并发送。兼容对接各种常见RTMP实现。支持enhanced RTMP。
- RTP。支持解析扩展头
- HTTP API接口。用于获取服务信息,向服务发送命令。
- HTTP Notify事件回调。获取时间通知,业务方可以轻松定制自身的逻辑。
- 支持多种方式鉴权
- 支持分布式集群
- 静态pull回源。通过配置文件配置回源地址
- 静态push转推。支持转推多个地址。通过配置文件配置转推地址
- 支持按需回源。没有观众的回源拉流可以主动关闭
- CORS跨域。支持HTTP-FLV,HTTP-TS,HLS跨域拉流。HTTP-API支持跨域。
- HTTP文件服务器。比如HLS切片文件可直接播放,不需要额外的HTTP文件服务器
- 监听端口复用。HTTP-FLV,HTTP-TS,HLS可使用相同的端口。over HTTPS类似
- 秒开播放。GOP缓冲
- 支持(在服务端)自动叠加静音音频
- 支持先拉流后推流
- 支持推流断开后重连,拉流端无感知。
- 支持自定义debug格式流录制、流回放,快速复现、定位问题
- 自带Web UI页面
- 支持有B帧的视频
# 协议转换支持情况
转封装类型 | rtmp | http[s]/websocket[s]-flv | http[s]/websocket[s]-ts | hls | rtsp |
---|---|---|---|---|---|
rtmp | √ | √ | √ | √ | √ |
rtsp | √ | √ | √ | √ | √ |
# 各封装协议对编码协议的支持情况
编码类型 | rtmp | rtsp | hls | flv | mpegts |
---|---|---|---|---|---|
aac | √ | √ | √ | √ | √ |
avc/h264 | √ | √ | √ | √ | √ |
hevc/h265 | √ | √ | √ | √ | √ |
# 录制文件的类型
录制类型 | hls | flv | mpegts |
---|---|---|---|
rtmp | √ | √ | √ |
rtsp | √ | √ | √ |
# 各协议推拉流url地址列表
# 启动成功后,就可以开始使用了。 作为流媒体服务,最主要的功能就是流数据转发。比如:
使用ffmpeg推rtmp流:
ffmpeg -re -i demo.flv -c:a copy -c:v copy -f flv rtmp://127.0.0.1:1935/live/test110
1
使用ffplay拉rtmp流播放:
ffplay rtmp://127.0.0.1/live/test110
1
# 各协议推拉流url地址列表
协议 | url地址 | 协议标准端口 |
---|---|---|
RTMP推流 | rtmp://127.0.0.1:1935/live/test110 | 1935 |
RTSP推流 | rtsp://localhost:5544/live/test110 | 554 |
RTMP拉流 | rtmp://127.0.0.1:1935/live/test110 | 1935 |
HTTP-FLV拉流 | http://127.0.0.1:8080/live/test110.flv https://127.0.0.1:4433/live/test110.flv (https地址) | 80 443 |
WebSocket-FLV拉流 | ws://127.0.0.1:8080/live/test110.flv wss://127.0.0.1:4433/live/test110.flv (websockets地址) | 80 443 |
HLS(m3u8+ts)拉流 | http://127.0.0.1:8080/hls/test110.m3u8 (直播地址格式1) http://127.0.0.1:8080/hls/test110/playlist.m3u8 (直播地址格式2) http://127.0.0.1:8080/hls/test110/record.m3u8 (全量录播地址) | 80 |
RTSP拉流 | rtsp://localhost:5544/live/test110 | 554 |
HTTP-TS拉流 | http://127.0.0.1:8080/live/test110.ts (http地址) https://127.0.0.1:4433/live/test110.ts (https地址) ws://127.0.0.1:8080/live/test110.ts (websocket地址) wss://127.0.0.1:4433/live/test110.ts (websockets地址) | 80 443 80 443 |
# 关于端口
Note: 表格示例中的端口是初始配置,用户可自由修改配置
# 播放器支持
拉流客户端 | RTMP | RTSP | HTTP-FLV | HTTPS-FLV | HLS | HTTP-TS | WebSocket-FLV | WebSocket-TS |
---|---|---|---|---|---|---|---|---|
ffmpeg/ffplay | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | X | X |
vlc | ✔ | ✔ | ✔ | X | ✔ | ✔ | X | X |
MPV | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | X | X |
flv.js | X | X | ✔ | ? | X | X | ✔ | X |
hls.js | X | X | X | X | ✔ | X | X | X |
西瓜播放器(js) | X | X | ✔ | ? | ✔ | X | ✔ | X |
# 性能测试
- 测试机:32核16G
- 压测工具:pushrtmp 以及 pullrtmp
- 推流码率:大概200kbps
# 测试场景一:
持续推送n路RTMP流至流媒体服务器
推流数量 | CPU占用 | 内存占用(RES) |
---|---|---|
1000 | (占单个核的) 16% | 104MB |
# 测试场景二:
持续推送1路RTMP流服务器,使用RTMP协议拉取n路流
推流数量 | CPU占用 | 内存占用(RES) |
---|---|---|
1000 | (占单个核的) 30% | 120MB |
# 测试场景三:
持续推送1000路RTMP流至服务器,使用RTMP协议拉取1000路流(推拉流为1对1的关系)
推流数量 | 拉流数量 | CPU占用 | 内存占用(RES) |
---|---|---|---|
1000 | 1000 | 125% | 464MB |
# 延迟测试:
本地推拉流低延迟不到200毫秒
# 其他相关文档参考
- Delivery RTMP (opens new window): 如何部署SRS提供RTMP服务。
- Delivery HLS (opens new window): 如何部署SRS提供RTMP和HLS服务。
- Delivery HTTP FLV (opens new window): 如何部署SRS分发FLV流。
- Delivery HDS (opens new window): 如何部署SRS分发HDS流。
- Delivery DASH (opens new window): 如何部署SRS分发DASH流。
- Transmux SRT (opens new window): 如何部署SRS支持SRT流。
- Transmux GB28181 (opens new window):如何部署SRS支持GB28181流。
- Transcode (opens new window): 如何部署SRS对直播流转码。
- Snapshot (opens new window): 如何对直播流截图。
- Forward (opens new window): 如何部署SRS转发RTMP流到其他服务器。
- Low latency (opens new window): 如何部署SRS为低延迟模式。
- Ingest (opens new window): 如何将其他流拉到SRS作为RTMP流。
- HTTP Server (opens new window): 如何部署SRS为HTTP服务器。
- SRS DEMO (opens new window): 如何启动SRS的DEMO。
- Projects (opens new window): 都有谁在使用SRS。
- Setup (opens new window): SRS安装和部署摘要。
- WebRTC Play (opens new window): SRS支持WebRTC播放流。
- GB28181 Publish (opens new window): SRS支持GB28181推流。
- SRT Publish (opens new window): SRS支持SRT推流。
- HEVC/H.265 (opens new window): SRS支持H.265编码格式。
# Cluster Guides
- [Origin Cluster][v5_CN_OriginCluster]: 如何支持源站集群,扩展源站能力。
- [Edge Cluster: RTMP][v5_CN_SampleRTMPCluster]: 如何部署RTMP分发集群,譬如CDN支持RTMP分发。
- [Edge Cluster: FLV][v5_CN_SampleHttpFlvCluster]: 如何部署HTTP-FLV分发集群,譬如CDN支持HTTP-FLV分发。
- [Edge Cluster: HLS][v5_CN_SampleHlsCluster]: 如何部署HLS分发集群,比如CDN支持HLS分发。
- [VHOST][v5_CN_RtmpUrlVhos]: 如何一个集群支持多个用户,即Vhost。
- [Reload][v5_CN_Reload]: 如何不中断服务的前提下应用新的配置,即Reload。
- [Tracable Log][v5_CN_SrsLog]: 如何在集群中追溯错误和日志,基于连接的日志,排错日志。
- [Log Rotate][v5_CN_LogRotate]: 如何切割服务器的日志,然后压缩或者清理。
- [K8s][v4_CN_K8s]: 如何使用ACK(阿里云容器服务Kubernetes版) (opens new window)部署SRS集群。
# Integration Guides
- Linux Service (opens new window): 启动或停止服务。
- HTTP Callback (opens new window): 使用HTTP回调侦听SRS的事件。
- HTTP API (opens new window): 使用SRS的HTTP API获取数据。
- Special Control (opens new window): 一些特殊的控制配置。
# Solution Guides
- 陈海博:SRS在安防中的应用 (opens new window)
- 最佳实践:一对一通话 (opens new window),多人通话 (opens new window)和直播连麦 (opens new window)
- 最佳实践:如何扩展你的SRS并发能力? (opens new window)
- SRS是单进程模型,不支持多进程;可以使用集群 (opens new window) 或者ReusePort (opens new window)扩展多进程(多核)能力。
- 基于HLS-TS&RTMP-FLV的微信小程序点直播方案 (opens new window)
- 借力SRS落地实际业务的几个关键事项 (opens new window)
- 干货 | 基于SRS直播平台的监控系统之实现思路与过程 (opens new window)
- Android直播实现 (opens new window)
- SRS直播服务器与APP用户服务器的交互 (opens new window)
- 使用flvjs实现摄像头flv流低延时实时直播 (opens new window)
- IOS 直播方面探索(服务器搭建,推流,拉流) (opens new window)
- 国产开源流媒体SRS4.0对视频监控GB28181的支持 (opens new window)
# Develop Guide
- 高性能网络服务器设计 (opens new window),分析高性能网络服务器的设计要点。
- SRS高精度、低误差定时器 (opens new window),论高并发服务器的定时器问题。
- 协程原理:函数调用过程、参数和寄存器 (opens new window),剖析SRS协程实现的最底层原理。
- 性能优化:SRS为何能做到同类的三倍 (opens new window),论性能优化的七七八八、前前后后。
- SRS代码分析 (opens new window),分析SRS结构和代码逻辑,类结构图,线程模型,模块架构。
- Third-party Client SDK (opens new window): 第三方厂商提供的客户端推流和播放的SDK,一般是移动端包括Andoird和iOS。
- 轻量线程分析 (opens new window),分析SRS依赖的库ST的关键技术。
- SRS代码分析 (opens new window),分析SRS结构和代码逻辑,类结构图,线程模型,模块架构。
- 深度: 掀起你的汇编来:如何移植ST协程到其他系统或CPU? (opens new window)
- 肖志宏:SRS支持WebRTC级联和QUIC协议 (opens new window)
- StateThreads源码分析 (opens new window)
- SRS 4.0源码分析 (opens new window)
# Migrate From NGINX-RTMP
- NG EXEC (opens new window): 为特殊的事件执行外部程序,譬如exec_publish,当发布流时exec外部程序。
# Product & Milestones
- Milestones (opens new window): SRS的路线图和产品计划。
- Why SRS (opens new window): 为何选择SRS?SRS的路线图?
- GIT Mirrors (opens new window): SRS在各个主要GIT站点的镜像,代码都是保持同步的。
- Main Features (opens new window): SRS的功能列表。请注意有些功能只有特定的版本才有。请注意有些功能是实验性的。
- Releases (opens new window): SRS目前已经发布的版本。
- Docs (opens new window): SRS的详细文档。
- Compare (opens new window): SRS和其他服务器的对比。
- Performance (opens new window): SRS的性能测试报告。
# Tech Docs
- 历经5代跨越25年的RTC架构演化史 (opens new window)
- 技术解码 | SRT和RIST协议综述 (opens new window)
- 公众号专栏:SRS,知识库,重要功能和阶段性结果,解决方案和DEMO (opens new window)
- 公众号专栏:深度,底层技术分析,服务器模型,协议处理,性能优化等 (opens new window)
- 公众号专栏:动态,关于最新的会议和动态,新闻,社区等 (opens new window)
- WebRTC 的现状和未来:专访 W3C WebRTC Chair Bernard Aboba (opens new window)
- B站专栏(视频):SRS开源服务器 (opens new window)
- 零声学院(视频):SRS流媒体服务器实战 (opens new window)
- 音视频开发为什么要学SRS流媒体服务器 (opens new window)
Last Updated: 2024/11/16, 10:54:20