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





        

--- #### 工程目录说明 简单来说,主要源码在`app/`和`pkg/`两个目录下,后续我再画些源码架构图。 ``` app/ ......各种main包的源码文件,一个子目录对应一个main包,即对应可生成一个可执行文件 |-- lal/ ......lal main包的源码文件 bin/ ......可执行文件输出目录 conf/ ......配置文件目录 demo/ ......各种demo类型的main包,一个子目录对应一个demo,即对应可生成一个可执行文件 pkg/ ......源码包 |-- httpflv/ ......http flv协议 |-- rtmp/ ......rtmp协议 |-- util/ ......帮助类包 |-- bele/ ......大小端操作 |-- bininfo/ ......可执行文件版本等信息 |-- connstat/ ......连接超时信息 |-- log/ ......日志 |-- unique/ ......对象唯一ID ``` #### 编译和运行 ``` $go get -u github.com/q191201771/lal # cd into lal $./build.sh # ./bin/lal -c <配置文件> -l <日志配置文件>,比如: $./bin/lal -c conf/lal.conf.json -l conf/log.dev.xml ``` #### 配置文件说明 ``` { "sub_idle_timeout": 10, // 往客户端发送数据时的超时时间 "gop_cache_num": 2, // gop缓存个数,如果设置为0,则只缓存seq header,不缓存gop数据 "httpflv": { "sub_listen_addr": ":8080" // http-flv拉流地址 }, "rtmp": { "addr": ":8081" // rtmp服务器监听端口,NOTICE rtmp服务器部分正在开发中 } "pull": { // 如果设置,则当客户端连接lal拉流而lal上该流不存在时,lal会去该配置中的地址回源拉流至本地再转发给客户端 "type": "httpflv", // 回源类型,支持"httpflv" 或 "rtmp" "addr": "pull.xxx.com", // 回源地址 "connect_timeout": 2, // 回源连接超时时间 "read_timeout": 10, // 回源读取数据超时时间 "stop_pull_while_no_sub_timeout": 3000 // 回源的流超过多长时间没有客户端播放,则关闭回源的流 } } ``` TODO 日志配置文件说明 #### 简单压力测试 在一台双核腾讯云主机,以后会做更详细的测试以及性能优化。 | ~ | httpflv pull | httpflv sub | 平均%CPU | 入带宽 | 出带宽 | 内存RES | | - | - | - | - | - | - | - | | ~ | 1 | 300 | 8.8% | 1.5Mb | 450Mb | 36m | | ~ | 300 | 300->0 | 18% | 450Mb | ->0Mb | 1.3g | #### 依赖 * cihub/seelog * stretchr/testify/assert #### roadmap 正在实现rtmp服务器部分 #### 文档 * [rtmp handshake | rtmp握手简单模式和复杂模式](https://pengrl.com/p/20027/)