关于golang:Golang-开源流媒体音视频网络传输服务LAL

74次阅读

共计 9313 个字符,预计需要花费 24 分钟才能阅读完成。

一. 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 rtmp sub http[s]/websocket[s]-flv sub http[s]/websocket[s]-ts sub hls sub rtsp relay push rtmp
pub rtmp
pub rtsp
relay pull rtmp X .

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

编码类型 rtmp rtsp hls flv mpegts
aac
avc/h264
hevc/h265

录制文件的类型

录制类型 hls flv mpegts
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/test110 1935
RTSP 推流 rtsp://localhost:5544/live/test110 554
. . .
RTMP 拉流 rtmp://127.0.0.1:1935/live/test110 1935
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/test110 554
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

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

正文完
 0