一. lal 简介

lal是开源直播流媒体网络传输我的项目,次要由三局部组成:

  • lalserver:流媒体转发服务器。相似于nginx-rtmp-module等服务,但反对更多的协定,提供更丰盛的性能。
  • demo:一些小利用,比方推、拉流客户端,压测工具,流剖析工具,调度示例程序等。相似于ffmpeg、ffprobe等利用。
  • pkg:流媒体协定库。相似于ffmpeg的libavformat等库。

以下是lal源码架构图,从中你能够大抵理解lal是如何划分性能档次的:

lal github地址: https://github.com/q191201771...

二. lalserver 疾速开始

1 编译

形式1,从源码自行编译

$git clone https://github.com/q191201771/lal.git$cd lal$export GO111MODULE=on && export GOPROXY=https://goproxy.cn,https://goproxy.io,direct$make

或者应用GoLand等IDE编译。
如果没有装置Go编译器,可参考《CentOS或macOS装置GoLang》,windows操作系统可自行上网搜寻教程。

形式2,间接下载编译好的二进制可执行文件

点我关上《github lal最新release版本页面》,可下载linux/macos/windows平台编译好的lal二进制可执行文件(zip压缩包模式)。

形式3,应用docker

docker又分为两种形式,一种是间接从Docker Hub下载曾经编译好的镜像并运行:

$docker run -it -p 1935:1935 -p 8080:8080 -p 4433:4433 -p 5544:5544 -p 8083:8083 -p 8084:8084 -p 30000-30100:30000-30100/udp q191201771/lal /lal/bin/lalserver -c /lal/conf/lalserver.conf.json

另一种是依据本地代码和Dockerfile文件生成镜像并运行:

$git clone https://github.com/q191201771/lal.git$cd lal$docker build -t lal .$docker run -it -p 1935:1935 -p 8080:8080 -p 4433:4433 -p 5544:5544 -p 8083:8083 -p 8084:8084 -p 30000-30100:30000-30100/udp lal /lal/bin/lalserver -c /lal/conf/lalserver.conf.json

2 运行

$./bin/lalserver -c conf/lalserver.conf.json

3 体验性能

lalserver服务启动后,就能够进行推拉流了。

三. lalserver 简介

lalserver是流媒体转发服务。相似于nginx-rtmp-module服务,简略来说,这类服务的外围性能是将推流客户端发送过去的音视频数据转发给对应的拉流客户端。
但lalserver反对更多的协定,提供更丰盛的性能。

1 lalserver 个性

  • [x] 全平台

    • [x] 反对linux/macOS/windows多零碎开发、调试、运行。反对多arch比方amd64/arm64/arm32/ppc64le/mipsle/s390x
    • [x] 反对穿插编译。可在任一平台编译出其余平台的可执行文件
    • [x] 无依赖。生成的可执行文件无任何环境、库依赖,可单文件独立运行
    • [x] (开放源码的同时)提供各平台可执行文件,可免编译间接运行
    • [x] 反对docker
  • [x] 高性能。多核多线程扩大
  • [x] 多种直播流封装协定。反对RTMP/RTSP/HTTP-FLV/HTTP-TS/HLS,反对不同封装协定间互相转换
  • [x] 多种编码格局。视频反对H264/AVC,H265/HEVC,音频反对AAC
  • [x] 多种格局录制。反对FLV,长MPEGTS,HLS录制(HLS直播与录制可同时开启)
  • [x] HTTPS。反对HTTPS-FLV,HTTPS-TS,HLS over HTTPS拉流
  • [x] WebSocket/WebSockets。反对Websocket-FLV,WebSocket-TS拉流
  • [x] HLS。反对实时直播、全列表直播。切片文件反对多种删除形式。反对内存切片
  • [x] RTSP。反对over TCP(interleaved模式)。反对basic/digest auth验证。反对GET_PARAMETER。兼容对接各种常见H264/H265/AAC实现
  • [x] RTMP。残缺反对RTMP协定,兼容对接各种常见RTMP实现。反对给单视频增加静音音频数据,反对合并发送
  • [x] HTTP API接口。用于获取服务信息,向服务发送命令。
  • [x] HTTP Notify事件回调
  • [x] 反对多种形式鉴权
  • [x] 分布式集群
  • [x] 动态pull回源。通过配置文件配置回源地址
  • [x] 动态push转推。反对转推多个地址。通过配置文件配置转推地址
  • [x] CORS跨域。反对HTTP-FLV,HTTP-TS,HLS跨域拉流
  • [x] HTTP文件服务器。比方HLS切片文件可间接播放,不须要额定的HTTP文件服务器
  • [x] 监听端口复用。HTTP-FLV,HTTP-TS,HLS可应用雷同的端口。over HTTPS相似
  • [x] 秒开播放。GOP缓冲

2 lalserver 反对的协定

封装协定间转换的反对状况

转封装类型sub rtmpsub http[s]/websocket[s]-flvsub http[s]/websocket[s]-tssub hlssub rtsprelay push rtmp
pub rtmp
pub rtsp
relay pull rtmpX.

各封装协定对编码协定的反对状况

编码类型rtmprtsphlsflvmpegts
aac
avc/h264
hevc/h265

录制文件的类型

录制类型hlsflvmpegts
pub rtmp
pub rtsp

表格含意见: 连贯类型之session pub/sub/push/pull

留神,如果只是rtsp流(确切的说是rtp包)相互间转发,不波及到转封装成其余格局,实践上其余编码类型也反对。

3 lalserver 个性图

lal github地址: https://github.com/q191201771...

四. lalserver 各协定推拉流url地址列表

协定url地址协定规范端口
RTMP推流rtmp://127.0.0.1:1935/live/test1101935
RTSP推流rtsp://localhost:5544/live/test110554
...
RTMP拉流rtmp://127.0.0.1:1935/live/test1101935
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/test110554
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

对于端口

如果应用协定规范端口,则地址中的端口能够省略,比方http的默认端口是80,则http://127.0.0.1:80/live/test110.flv变成http://127.0.0.1/live/test110.flv

如果你不相熟推拉流客户端该如何配合应用,可参考 常见推拉流客户端信息汇总

lal github地址: https://github.com/q191201771...

五. lalserver 配置文件阐明

{  "# doc of config": "https://pengrl.com/lal/#/ConfigBrief", //. 配置文件对应的文档阐明链接,在程序中没理论用处  "conf_version": "0.2.8",                                   //. 配置文件版本号,业务方不应该手动批改,程序中会查看该版本                                                             //  号是否与代码中申明的统一  "rtmp": {    "enable": true,                      //. 是否开启rtmp服务的监听                                         //  留神,配置文件中管制各协定类型的enable开关都应该按需关上,防止造成不必要的协定转换的开销    "addr": ":1935",                     //. RTMP服务监听的端口,客户端向lalserver推拉流都是这个地址    "gop_num": 0,                        //. RTMP拉流的GOP缓存数量,减速流关上工夫,然而可能减少延时                                         //. 如果为0,则不应用缓存发送    "merge_write_size": 0,               //. 将小包数据合并进行发送,单位字节,进步服务器性能,然而可能造成卡顿                                         //  如果为0,则不合并发送    "add_dummy_audio_enable": false,     //. 是否开启动静检测增加静音AAC数据的性能                                         //  如果开启,rtmp pub推流时,如果超过`add_dummy_audio_wait_audio_ms`工夫仍然没有                                         //  收到音频数据,则会主动为这路流叠加AAC的数据    "add_dummy_audio_wait_audio_ms": 150 //. 单位毫秒,具体见`add_dummy_audio_enable`  },  "default_http": {                       //. http监听相干的默认配置,如果hls, httpflv, httpts中没有独自配置以下配置项,                                          //  则应用default_http中的配置                                          //  留神,hls, httpflv, httpts服务是否开启,不禁此处决定    "http_listen_addr": ":8080",          //. HTTP监听地址    "https_listen_addr": ":4433",         //. HTTPS监听地址    "https_cert_file": "./conf/cert.pem", //. HTTPS的本地cert文件地址    "https_key_file": "./conf/key.pem"    //. HTTPS的本地key文件地址  },  "httpflv": {    "enable": true,          //. 是否开启HTTP-FLV服务的监听    "enable_https": true,    //. 是否开启HTTPS-FLV监听    "url_pattern": "/",      //. 拉流url路由门路地址。默认值为`/`,示意不受限制,路由地址能够为任意门路地址。                             //  如果设置为`/live/`,则只能从`/live/`门路下拉流,比方`/live/test110.flv`    "gop_num": 0             //. 见rtmp.gop_num  },  "hls": {    "enable": true,                  //. 是否开启HLS服务的监听    "enable_https": true,            //. 是否开启HTTPS-HLS监听                                     //    "url_pattern": "/hls/",          //. 拉流url路由地址,默认值`/hls/`,对应的HLS(m3u8)拉流url地址:                                     //  - `/hls/{streamName}.m3u8`                                     //  - `/hls/{streamName}/playlist.m3u8`                                     //  - `/hls/{streamName}/record.m3u8`                                     //                                     //  playlist.m3u8文件对应直播hls,列表中只保留<fragment_num>个ts文件名称,会继续增                                     //  加新生成的ts文件,并去除过期的ts文件                                     //  record.m3u8文件对应录制hls,列表中会保留从第一个ts文件到最新生成的ts文件,会持                                     //  续追加新生成的ts文件                                     //                                     //  ts文件地址备注如下:                                     //  - `/hls/{streamName}/{streamName}-{timestamp}-{index}.ts` 或                                     //    `/hls/{streamName}-{timestamp}-{index}.ts`                                     //                                     //  留神,hls的url_pattern不能和httpflv、httpts的url_pattern雷同                                     //    "out_path": "./lal_record/hls/", //. HLS的m3u8和文件的输入根目录    "fragment_duration_ms": 3000,    //. 单个TS文件切片时长,单位毫秒    "fragment_num": 6,               //. playlist.m3u8文件列表中ts文件的数量                                     //    "delete_threshold": 6,           //. ts文件的删除机会                                     //  留神,只在配置项`cleanup_mode`为2时应用                                     //  含意是只保留最近从playlist.m3u8中移除的ts文件的个数,更早过期的ts文件将被删除                                     //  如果没有,默认值取配置项`fragment_num`的值                                     //  留神,该值应该不小于1,防止删除过快导致播放失败                                     //    "cleanup_mode": 1,               //. HLS文件清理模式:                                     //                                     //  0 不删除m3u8+ts文件,可用于录制等场景                                     //                                     //  1 在输出流完结后删除m3u8+ts文件                                     //    留神,确切的删除工夫点是推流完结后的                                     //    `fragment_duration_ms * (fragment_num + delete_threshold)`                                     //    推延一小段时间删除,是为了防止输出流刚完结,HLS的拉流端还没有拉取完                                     //                                     //  2 推流过程中,继续删除过期的ts文件,只保留最近的                                     //    `delete_threshold + fragment_num + 1`                                     //    个左右的ts文件                                     //    并且,在输出流完结后,也会执行清理模式1的逻辑                                     //                                     //  留神,record.m3u8只在0和1模式下生成                                     //    "use_memory_as_disk_flag": false //. 是否应用内存取代磁盘,保留m3u8+ts文件                                     //  留神,应用该模式要留神内存容量。一般来说不应该搭配`cleanup_mode`为0或1应用  },  "httpts": {    "enable": true,         //. 是否开启HTTP-TS服务的监听。留神,这并不是HLS中的TS,而是在一条HTTP长连贯上持续性传输TS流    "enable_https": true,   //. 是否开启HTTPS-TS监听    "url_pattern": "/"      //. 拉流url路由门路地址。默认值为`/`,示意不受限制,路由地址能够为任意门路地址。                            //  如果设置为`/live/`,则只能从`/live/`门路下拉流,比方`/live/test110.ts`  },  "rtsp": {    "enable": true, //. 是否开启rtsp服务的监听,目前只反对rtsp推流    "addr": ":5544" //. rtsp推流地址  },  "record": {    "enable_flv": true,                      //. 是否开启flv录制    "flv_out_path": "./lal_record/flv/",     //. flv录制目录    "enable_mpegts": true,                   //. 是否开启mpegts录制。留神,此处是长ts文件录制,hls录制由下面的hls配置管制    "mpegts_out_path": "./lal_record/mpegts" //. mpegts录制目录  },  "relay_push": {    "enable": false, //. 是否开启中继转推性能,开启后,本身接管到的所有流都会转推出去    "addr_list":[    //. 中继转推的对端地址,反对填写多个地址,做1对n的转推。格局举例 "127.0.0.1:19351"    ]  },  "relay_pull": {    "enable": false, //. 是否开启回源拉流性能,开启后,当本身接管到拉流申请,而流不存在时,会从其余服务器拉取这个流到本地    "addr": ""       //. 回源拉流的地址。格局举例 "127.0.0.1:19351"  },  "http_api": {    "enable": true, //. 是否开启HTTP API接口    "addr": ":8083" //. 监听地址  },  "server_id": "1", //. 以后lalserver惟一ID。多个lalserver HTTP Notify同一个地址时,可通过该ID辨别  "http_notify": {    "enable": true,                                              //. 是否开启HTTP Notify事件回调    "update_interval_sec": 5,                                    //. update事件回调距离,单位毫秒    "on_server_start": "http://127.0.0.1:10101/on_server_start", //. 各事件HTTP Notify事件回调地址    "on_update": "http://127.0.0.1:10101/on_update",    "on_pub_start": "http://127.0.0.1:10101/on_pub_start",    "on_pub_stop": "http://127.0.0.1:10101/on_pub_stop",    "on_sub_start": "http://127.0.0.1:10101/on_sub_start",    "on_sub_stop": "http://127.0.0.1:10101/on_sub_stop",    "on_rtmp_connect": "http://127.0.0.1:10101/on_rtmp_connect"  },  "simple_auth": {                    // 鉴权文档见: https://pengrl.com/lal/#/auth    "key": "q191201771",              // 公有key,计算md5鉴权参数时应用    "dangerous_lal_secret": "pengrl", // 后门鉴权参数,所有的流可通过该参数值鉴权    "pub_rtmp_enable": false,         // rtmp推流是否开启鉴权,true为开启鉴权,false为不开启鉴权    "sub_rtmp_enable": false,         // rtmp拉流是否开启鉴权    "sub_httpflv_enable": false,      // httpflv拉流是否开启鉴权    "sub_httpts_enable": false,       // httpts拉流是否开启鉴权    "pub_rtsp_enable": false,         // rtsp推流是否开启鉴权    "sub_rtsp_enable": false,         // rtsp拉流是否开启鉴权    "hls_m3u8_enable": true           // m3u8拉流是否开启鉴权  },  "pprof": {    "enable": true, //. 是否开启Go pprof web服务的监听    "addr": ":8084" //. Go pprof web地址  },  "log": {    "level": 1,                         //. 日志级别,0 trace, 1 debug, 2 info, 3 warn, 4 error, 5 fatal    "filename": "./logs/lalserver.log", //. 日志输入文件    "is_to_stdout": true,               //. 是否打印至标记控制台输入    "is_rotate_daily": true,            //. 日志按天翻滚    "short_file_flag": true,            //. 日志开端是否携带源码文件名以及行号的信息    "assert_behavior": 1                //. 日志断言的行为,1 只打印谬误日志 2 打印并退出程序 3 打印并panic  },  "debug": {    "log_group_interval_sec": 30,          // 打印group调试日志的间隔时间,单位秒。如果为0,则不打印    "log_group_max_group_num": 10,         // 最多打印多少个group    "log_group_max_sub_num_per_group": 10  // 每个group最多打印多少个sub session  }}

六. Demo 简介

lal我的项目中,除了/app/lalserver这个比拟外围的服务之外,在/app/demo目录下还额定提供了一些小利用,性能简介:

| demo | 阐明 |
| - | - |
| pushrtmp | RTMP推流客户端;压力测试工具 |
| pullrtmp | RTMP拉流客户端;压力测试工具 |
| pullrtmp2pushrtmp | 从远端服务器拉取RTMP流,并应用RTMP转推出去,反对1对n转推 |
| pullrtmp2pushrtsp | 从远端服务器拉取RTMP流,并应用RTSP转推出去 |
| pullrtmp2hls | 从远端服务器拉取RTMP流,存储为本地m3u8+ts文件 |
| pullhttpflv | HTTP-FLV拉流客户端 |
| pullrtsp | RTSP拉流客户端 |
| pullrtsp2pushrtsp | 从远端服务器拉取RTSP流,并应用RTSP转推出去 |

pullrtsp2pushrtmp从远端服务器拉取RTSP流,并应用RTMP转推出去
benchrtmpconnect对rtmp做并发建连压力测试
calcrtmpdelay测试rtmp服务器收发数据的延时
analyseflv从远端服务器拉取HTTP-FLV流,并进行剖析
dispatch简略演示如何实现一个简略的调度服务,使得多个lalserver节点能够组成一个集群
flvfile2es将本地FLV文件拆散成H264/AVC和AAC的ES流文件
modflvfile批改flv文件的一些信息(比方某些tag的工夫戳)后另存文件

(更具体的性能加入各源码文件的头部阐明)

七. 分割作者

  • 邮箱:191201771@qq.com
  • 微信: q191201771
  • QQ: 191201771
  • 微信群: 加我微信好友后,通知我拉你进群
  • QQ群: 1090510973
  • lal github地址: https://github.com/q191201771...
  • lal官网文档: https://pengrl.com/lal

欢送任何技术和非技术的交换。