mirror of https://github.com/q191201771/lal.git
aacflashflvgolanggolang-rtmph264-avch265-hevchlshttp-tshttps-flvlallive-media-serverlivestreamm3u8mpegtsrtcprtmprtprtspvideo
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
344029e762 | 5 years ago | |
---|---|---|
app | 5 years ago | |
conf | 5 years ago | |
pkg | 5 years ago | |
.gitignore | 5 years ago | |
.travis.yml | 6 years ago | |
CHANGELOG.md | 5 years ago | |
LICENSE | 6 years ago | |
README.md | 5 years ago | |
build.sh | 5 years ago | |
build_linux.sh | 5 years ago | |
go.mod | 5 years ago | |
go.sum | 5 years ago | |
test.sh | 5 years ago |
README.md
Go语言编写的直播流媒体网络传输服务器。本项目遵循的原则或者说最终目标是:
没有蛀。。- 可读可维护。框架清晰,模块化,按业务逻辑层,协议层,传输层分层。
- 可快速集成各种协议(rtmp / http-flv / hls, rtp / rtcp / webrtc, quic, srt, over tcp, over udp...)
- 高性能
目前 rtmp / http-flv 部分基本完成了。第一个目标大版本会实现直播源站以及直播 CDN 分发相关的功能。
README 目录
- 源码框架
- 编译和运行
- 配置文件说明
- 性能测试
- 测试过的第三方客户端
- Roadmap
- 联系我
源码框架
简单来说,源码在app/
和pkg/
两个目录下,后续我再画些源码架构图。
app/ ......各种main包的源码文件,一个子目录对应一个main包,即对应可生成一个可执行文件
|-- lals/ ......[最重要的] 流媒体服务器
|-- flvfile2rtmppush ......// rtmp 推流客户端,读取本地 flv 文件,使用 rtmp 协议推送出去
//
// 支持循环推送:文件推送完毕后,可循环推送(rtmp push 流并不断开)
// 支持推送多路流:相当于一个 rtmp 推流压测工具
|-- httpflvpull ......http-flv拉流客户端
|-- rtmppull ......rtmp拉流客户端,存储为本地flv文件
|-- modflvfile ......修改本地flv文件
|-- flvfile2es ......将本地flv文件分离成h264/avc es流文件以及aac es流文件
pkg/ ......源码包
|-- aac/ ......音频aac编解码格式相关
|-- avc/ ......视频avc h264编解码格式相关
|-- httpflv/ ......http-flv协议
|-- logic/ ......lals服务器的上层业务
|-- rtmp/ ......rtmp协议
bin/ ......可执行文件编译输出目录
conf/ ......配置文件目录
目前唯一的第三方依赖(我自己写的 Go 基础库): github.com/q191201771/naza
编译和运行
# 不使用 Go module
$go get -u github.com/q191201771/lal
# cd into $GOPATH/src/github.com/q191201771/lal
$./build.sh
# 使用 go module
$export GOPROXY=https://goproxy.cn
$git clone https://github.com/q191201771/lal.git && cd lal && ./build.sh
# 运行
$./bin/lals -c conf/lals.conf.json
配置文件说明
{
"rtmp": {
"addr": ":19350" // rtmp服务监听的端口
},
"httpflv": {
"sub_listen_addr": ":8080"
},
"log": {
"level": 1, // 日志级别,1 debug, 2 info, 3 warn, 4 error, 5 fatal
"filename": "./logs/lals.log", // 日志输出文件
"is_to_stdout": true, // 是否打印至标志控制台输出
"is_rotate_daily": true, // 日志按天翻滚
"short_file_flag": true // 日志末尾是否携带源码文件名以及行号的信息
},
"pprof": {
"addr": ":10001" // Go pprof web 地址
}
}
其它放在代码中的配置:
性能测试
测试场景一:持续推送 n 路 rtmp 流至 lals(没有拉流)
推流数量 | CPU 占用 | 内存占用(RES) |
---|---|---|
1000 | (占单个核的)16% | 104MB |
测试场景二:持续推送1路 rtmp 流至 lals,使用 rtmp 协议从 lals 拉取 n 路流
拉流数量 | CPU 占用 | 内存占用(RES) |
---|---|---|
1000 | (占单个核的)30% | 120MB |
- 测试机:32核16G(lals 服务器和压测工具同时跑在这一个机器上)
- 压测工具:lal 中的
/app/flvfile2rtmppush
以及/app/rtmppull
- 推流码率:使用
srs-bench
中的 flv 文件,大概200kbps - lals 版本:基于 git commit: fc0b04651af53a68758f41e5dfccdb7838e55a45
由于测试机是台共用的机器,上面还跑了许多其他服务,这里列的只是个粗略的数据,还待做更多的性能分析以及优化。如果你对性能感兴趣,欢迎进行测试并将结果反馈给我。
测试过的第三方客户端
推流端:
- OBS 21.0.3(mac)
- ffmpeg 3.4.2(mac)
- srs-bench (srs项目配套的一个压测工具)
- flvfile2rtmppush (lal app中的rtmp推流客户端)
拉流端:
- VLC 2.2.6(mac)
- MPV 0.29.1(mac)
- ffmpeg 3.4.2(mac)
- srs-bench (srs项目配套的一个压测工具)
Roadmap
有建议、意见、bug、功能等等欢迎提 issue 啊,100% 会回复的。
lals 服务器目标版本功能如下:
v1.0.0
- 接收 rtmp 推流 [DONE]
- 转发给 rtmp 拉流 [DONE]
- 转发给 http-flv 拉流 [DONE]
- AAC [DONE]
- H264 [DONE]
- 各种 rtmp 推流、拉流客户端兼容性测试
- 和其它主流 rtmp 服务器的性能对比测试
- 整理日志
- 调整框架代码
- 稳定性测试
v2.0.0
- Gop 缓存功能
v3.0.0
- rtmp 转推
- rtmp 回源
- http-flv 回源
v4.0.0
- udp quic srt
- rtp/rtcp
- webrtc
v5.0.0
- 分布式。提供与外部调度系统交互的接口。应对多级分发场景,或平级源站类型场景
没有排到预期版本中的功能
- hls
- h265
文档
- rtmp handshake | rtmp握手简单模式和复杂模式
- rtmp协议中的chunk stream id, message stream id, transaction id, message type id
联系我
欢迎扫码加我微信,进行技术交流或扯淡。