Wide
Go语言编写的直播流媒体网络传输服务器





        

--- 已支持RTMP,HTTP-FLV,HLS(m3u8 + ts),H264/AVC,H265/HEVC,AAC,GOP缓存。 ### README 目录 1. 编译、运行、体验功能 2. 配置文件说明 3. 仓库目录框架 4. Roadmap 5. 文档 6. 联系我 7. 性能测试,测试过的第三方客户端 ### 一. 编译、运行、体验功能 #### 编译 方式1,直接下载编译好的二进制可执行文件 上[最新发布版本页面](https://github.com/q191201771/lal/releases/latest),下载对应平台编译好的二进制可执行文件的zip压缩包。 方式2,自己编译 ```shell # 不使用 Go module $go get -u github.com/q191201771/lal $cd $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 ``` #### 运行 ```shell $./bin/lals -c conf/lals.conf.json ``` #### 体验功能 快速体验lals服务器见:[常见推拉流客户端软件的使用方式](https://pengrl.com/p/20051/) ### 二. 配置文件说明 ``` { "rtmp": { "addr": ":19350", // RTMP服务监听的端口,客户端向lals推拉流都是这个地址 "gop_num": 2 // RTMP拉流的GOP缓存数量,加速秒开 }, "httpflv": { "sub_listen_addr": ":8080", // HTTP-FLV拉流地址 "gop_num": 2 }, "hls": { "sub_listen_addr": ":8081", // HLS监听地址 "out_path": "/tmp/lal/hls/", // HLS文件保存根目录 "fragment_duration_ms": 3000, // 单个TS文件切片时长 "fragment_num": 6 // M3U8文件列表中TS文件的数量 }, "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, // 日志末尾是否携带源码文件名以及行号的信息 "assert_behavior": 1 // 日志断言的行为,1 只打印错误日志 2 打印并退出程序 3 打印并panic }, "pprof": { "addr": ":10001" // Go pprof web地址 } } ``` 其它放在代码中的配置: - [rtmp/var.go](https://github.com/q191201771/lal/blob/master/pkg/rtmp/var.go) - [httpflv/var.go](https://github.com/q191201771/lal/blob/master/pkg/httpflv/var.go) ### 三. 仓库目录框架 简单来说,源码在`pkg/`,`app/`,`demo/`三个目录下。 - `pkg/`:存放各package包,供本repo的程序以及其他业务方使用 - `app/`:重要程序的入口(目前仅包含lals——基于lal编写的一个通用流媒体服务器程序) - `demo/`:存放各种基于`lal/pkg`开发的小程序(小工具),一个子目录是一个程序,详情见各源码文件中头部的说明 ``` pkg/ ...... |-- rtmp/ ......RTMP协议 |-- httpflv/ ......HTTP-FLV协议 |-- hls/ ......HLS协议 |-- logic/ ......lals服务器程序的上层业务逻辑 |-- aac/ ......音频AAC编码格式相关 |-- avc/ ......视频H264/AVC编码格式相关 |-- hevc/ ......视频H265/HEVC编码格式相关 app/ ...... |-- lals/ ......流媒体服务器lals的main函数入口 demo/ ...... |-- analyseflv ...... |-- analysehls ...... |-- flvfile2rtmppush ...... |-- rtmppull ...... |-- httpflvpull ...... |-- modflvfile ...... |-- flvfile2es ...... |-- learnts ...... |-- tscmp ...... bin/ ......可执行文件编译输出目录 conf/ ......配置文件目录 ``` 后续我再画些源码架构图。 目前唯一的第三方依赖(我自己写的Go基础库): [github.com/q191201771/naza](https://github.com/q191201771/naza) ### 四. Roadmap #### 项目原则: * 代码可读可维护 * 框架清晰,模块化。业务与协议隔离。协议、网络传输等基础功能都是功能纯粹,可独立使用的库。 * 高性能 * 提供各种client代码,即使你使用其他流媒体服务器,这些client也是非常好用的 * 依托Go语言,提供所有平台下最简单的编译、调试、发布方式 * 不依赖第三方代码 * 后续可快速集成各种网络传输协议,流媒体封装协议 #### lals服务器功能 - [x] **pub 接收推流:** RTMP - [x] **sub 接收拉流:** RTMP,HTTP-FLV,HLS(m3u8+ts) - [x] **音频编码格式:** AAC - [x] **视频编码格式:** H264/AVC,H265/HEVC - [x] **GOP缓存:** 用于秒开 TODO - RTMP转推 - RTMP回源 - HTTP-FLV回源 - 静态转推、回源 - 动态转推、回源 - rtsp - rtp/rtcp - webrtc - udp quic - udp srt - udp kcp - 分布式。提供与外部调度系统交互的接口。应对多级分发场景,或平级源站类型场景 - 调整框架代码 - 各种推流、拉流客户端兼容性测试 - 和其它主流服务器的性能对比测试 - 整理日志 - 稳定性测试 - mp4 ### 五. 文档 * [流媒体音视频相关的点我](https://pengrl.com/categories/%E6%B5%81%E5%AA%92%E4%BD%93%E9%9F%B3%E8%A7%86%E9%A2%91/) * [Go语言相关的点我](https://pengrl.com/categories/Go/) * [我写的其他文章](https://pengrl.com/all/) ### 六. 联系我 扫码加我微信(微信号: q191201771),进行技术交流或扯淡。微信群已开放,加我好友后可拉进群。 ### 七. 性能测试,测试过的第三方客户端 见[TEST.md](https://github.com/q191201771/lal/blob/master/TEST.md)