Wide
Go语言编写的流媒体 库 / 客户端 / 服务端





        

--- Go语言编写的流媒体 库 / 客户端 / 服务器。目前 rtmp / http-flv 部分基本完成了。 #### 源码框架 简单来说,主要源码在`app/`和`pkg/`两个目录下,后续我再画些源码架构图。 ``` app/ ......各种main包的源码文件,一个子目录对应一个main包,即对应可生成一个可执行文件 |-- lals/ ......[最重要的] 流媒体服务器 |-- flvfile2es ......将本地flv文件分离成h264/avc es流文件以及aac es流文件 |-- flvfile2rtmppush ......rtmp推流客户端,输入是本地flv文件,文件推送完毕后,可循环推送(rtmp push流并不断开) |-- httpflvpull ......http-flv拉流客户端 |-- modflvfile ......修改本地flv文件 |-- rtmppull ......rtmp拉流客户端,存储为本地flv文件 pkg/ ......源码包 |-- aac/ ......音频aac编解码格式相关 |-- avc/ ......视频avc h264编解码格式相关 |-- httpflv/ ......http-flv协议 |-- logic/ ......lals服务器的上层业务 |-- rtmp/ ......rtmp协议 bin/ ......可执行文件编译输出目录 conf/ ......配置文件目录 ``` 目前唯一的第三方依赖(我自己写的 Go 基础库): [github.com/q191201771/naza](https://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 地址 } } ``` 其它放在代码中的配置: - [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) #### 测试过的客户端 ``` 推流端: - 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 服务器目标版本roadmap如下: **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 最终目标: 性能ok,框架清晰,代码对于任何新手来说都是可读可维护的。 * 实现一个支持多种流媒体协议(比如rtmp, http-flv, hls, rtp/rtcp 等),多种底层传输协议(比如tcp, udp, srt, quic 等)的服务器 * 所有协议都以模块化的库形式提供给需要的用户使用 * 提供多种协议的推流客户端、拉流客户端,或者说演示demo #### 文档 * [rtmp handshake | rtmp握手简单模式和复杂模式](https://pengrl.com/p/20027/) * [rtmp协议中的chunk stream id, message stream id, transaction id, message type id](https://pengrl.com/p/25610/) #### 联系我 欢迎扫码加我微信,进行技术交流或扯淡。