Golang开源流媒体服务器(RTMP/RTSP/HLS/FLV等协议)

一. lal 简介

lal是开源直播流媒体网络传输项目,主要由三部分组成:

  • lalserver:流媒体转发服务器。类似于 nginx-rtmp-module等服务,但支持更多的协议,提供更丰富的功能。
  • demo:一些小应用,比如推、拉流客户端,压测工具,流分析工具,调度示例程序等。类似于ffmpeg、ffprobe等应用。
  • pkg:流媒体协议库。类似于ffmpeg的libavformat等库。

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

以下是lal源码架构图,从中你可以大致了解lal是如何划分功能层次的:

Golang开源流媒体服务器(RTMP/RTSP/HLS/FLV等协议)

二. 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服务启动后,就可以进行推拉流了。

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

三. lalserver 简介

lalserver是流媒体转发服务。类似于 nginx-rtmp-module服务,简单来说,这类服务的核心功能是将推流客户端发送过来的音视频数据转发给对应的拉流客户端。
但lalserver支持更多的协议,提供更丰富的功能。

1 lalserver 特性

  • 全平台
  • 支持linux/macOS/windows多系统开发、调试、运行。支持多arch比如amd64/arm64/arm32/ppc64le/mipsle/s390x
  • 支持交叉编译。可在任一平台编译出其他平台的可执行文件
  • 无依赖。生成的可执行文件无任何环境、库依赖,可单文件独立运行
  • (开放源码的同时)提供各平台可执行文件,可免编译直接运行
  • 支持docker
  • 高性能。多核多线程扩展
  • 多种直播流封装协议。支持RTMP/RTSP/HTTP-FLV/HTTP-TS/HLS,支持不同封装协议间相互转换
  • 多种编码格式。视频支持H264/AVC,H265/HEVC,音频支持AAC
  • 多种格式录制。支持FLV,长MPEGTS,HLS录制(HLS直播与录制可同时开启)
  • HTTPS。支持HTTPS-FLV,HTTPS-TS,HLS over HTTPS拉流
  • WebSocket/WebSockets。支持Websocket-FLV,WebSocket-TS拉流
  • HLS。支持实时直播、全列表直播。切片文件支持多种删除方式。支持内存切片
  • RTSP。支持over TCP(interleaved模式)。支持basic/digest auth验证。支持 GET_PARAMETER。兼容对接各种常见H264/H265/AAC实现
  • RTMP。完整支持RTMP协议,兼容对接各种常见RTMP实现。支持给单视频添加静音音频数据,支持合并发送
  • HTTP API接口。用于获取服务信息,向服务发送命令。
  • HTTP Notify事件回调
  • 支持多种方式鉴权
  • 分布式集群
  • 静态pull回源。通过配置文件配置回源地址
  • 静态push转推。支持转推多个地址。通过配置文件配置转推地址
  • CORS跨域。支持HTTP-FLV,HTTP-TS,HLS跨域拉流
  • HTTP文件服务器。比如HLS切片文件可直接播放,不需要额外的HTTP文件服务器
  • 监听端口复用。HTTP-FLV,HTTP-TS,HLS可使用相同的端口。over HTTPS类似
  • 秒开播放。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 特性图

Golang开源流媒体服务器(RTMP/RTSP/HLS/FLV等协议)

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

四. 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

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

五. 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&#x6587;&#x4EF6;&#x5BF9;&#x5E94;&#x76F4;&#x64AD;hls&#xFF0C;&#x5217;&#x8868;&#x4E2D;&#x53EA;&#x4FDD;&#x5B58;<fragment_num>&#x4E2A;ts&#x6587;&#x4EF6;&#x540D;&#x79F0;&#xFF0C;&#x4F1A;&#x6301;&#x7EED;&#x589E;
                                     //  &#x52A0;&#x65B0;&#x751F;&#x6210;&#x7684;ts&#x6587;&#x4EF6;&#xFF0C;&#x5E76;&#x53BB;&#x9664;&#x8FC7;&#x671F;&#x7684;ts&#x6587;&#x4EF6;
                                     //  record.m3u8&#x6587;&#x4EF6;&#x5BF9;&#x5E94;&#x5F55;&#x5236;hls&#xFF0C;&#x5217;&#x8868;&#x4E2D;&#x4F1A;&#x4FDD;&#x5B58;&#x4ECE;&#x7B2C;&#x4E00;&#x4E2A;ts&#x6587;&#x4EF6;&#x5230;&#x6700;&#x65B0;&#x751F;&#x6210;&#x7684;ts&#x6587;&#x4EF6;&#xFF0C;&#x4F1A;&#x6301;
                                     //  &#x7EED;&#x8FFD;&#x52A0;&#x65B0;&#x751F;&#x6210;&#x7684;ts&#x6587;&#x4EF6;
                                     //
                                     //  ts&#x6587;&#x4EF6;&#x5730;&#x5740;&#x5907;&#x6CE8;&#x5982;&#x4E0B;&#xFF1A;
                                     //  - /hls/{streamName}/{streamName}-{timestamp}-{index}.ts &#x6216;
                                     //    /hls/{streamName}-{timestamp}-{index}.ts
                                     //
                                     //  &#x6CE8;&#x610F;&#xFF0C;hls&#x7684;url_pattern&#x4E0D;&#x80FD;&#x548C;httpflv&#x3001;httpts&#x7684;url_pattern&#x76F8;&#x540C;
                                     //
    "out_path": "./lal_record/hls/", //. HLS&#x7684;m3u8&#x548C;&#x6587;&#x4EF6;&#x7684;&#x8F93;&#x51FA;&#x6839;&#x76EE;&#x5F55;
    "fragment_duration_ms": 3000,    //. &#x5355;&#x4E2A;TS&#x6587;&#x4EF6;&#x5207;&#x7247;&#x65F6;&#x957F;&#xFF0C;&#x5355;&#x4F4D;&#x6BEB;&#x79D2;
    "fragment_num": 6,               //. playlist.m3u8&#x6587;&#x4EF6;&#x5217;&#x8868;&#x4E2D;ts&#x6587;&#x4EF6;&#x7684;&#x6570;&#x91CF;
                                     //
    "delete_threshold": 6,           //. ts&#x6587;&#x4EF6;&#x7684;&#x5220;&#x9664;&#x65F6;&#x673A;
                                     //  &#x6CE8;&#x610F;&#xFF0C;&#x53EA;&#x5728;&#x914D;&#x7F6E;&#x9879;cleanup_mode&#x4E3A;2&#x65F6;&#x4F7F;&#x7528;
                                     //  &#x542B;&#x4E49;&#x662F;&#x53EA;&#x4FDD;&#x5B58;&#x6700;&#x8FD1;&#x4ECE;playlist.m3u8&#x4E2D;&#x79FB;&#x9664;&#x7684;ts&#x6587;&#x4EF6;&#x7684;&#x4E2A;&#x6570;&#xFF0C;&#x66F4;&#x65E9;&#x8FC7;&#x671F;&#x7684;ts&#x6587;&#x4EF6;&#x5C06;&#x88AB;&#x5220;&#x9664;
                                     //  &#x5982;&#x679C;&#x6CA1;&#x6709;&#xFF0C;&#x9ED8;&#x8BA4;&#x503C;&#x53D6;&#x914D;&#x7F6E;&#x9879;fragment_num&#x7684;&#x503C;
                                     //  &#x6CE8;&#x610F;&#xFF0C;&#x8BE5;&#x503C;&#x5E94;&#x8BE5;&#x4E0D;&#x5C0F;&#x4E8E;1&#xFF0C;&#x907F;&#x514D;&#x5220;&#x9664;&#x8FC7;&#x5FEB;&#x5BFC;&#x81F4;&#x64AD;&#x653E;&#x5931;&#x8D25;
                                     //
    "cleanup_mode": 1,               //. HLS&#x6587;&#x4EF6;&#x6E05;&#x7406;&#x6A21;&#x5F0F;&#xFF1A;
                                     //
                                     //  0 &#x4E0D;&#x5220;&#x9664;m3u8+ts&#x6587;&#x4EF6;&#xFF0C;&#x53EF;&#x7528;&#x4E8E;&#x5F55;&#x5236;&#x7B49;&#x573A;&#x666F;
                                     //
                                     //  1 &#x5728;&#x8F93;&#x5165;&#x6D41;&#x7ED3;&#x675F;&#x540E;&#x5220;&#x9664;m3u8+ts&#x6587;&#x4EF6;
                                     //    &#x6CE8;&#x610F;&#xFF0C;&#x786E;&#x5207;&#x7684;&#x5220;&#x9664;&#x65F6;&#x95F4;&#x70B9;&#x662F;&#x63A8;&#x6D41;&#x7ED3;&#x675F;&#x540E;&#x7684;
                                     //    fragment_duration_ms * (fragment_num + delete_threshold)
                                     //    &#x63A8;&#x8FDF;&#x4E00;&#x5C0F;&#x6BB5;&#x65F6;&#x95F4;&#x5220;&#x9664;&#xFF0C;&#x662F;&#x4E3A;&#x4E86;&#x907F;&#x514D;&#x8F93;&#x5165;&#x6D41;&#x521A;&#x7ED3;&#x675F;&#xFF0C;HLS&#x7684;&#x62C9;&#x6D41;&#x7AEF;&#x8FD8;&#x6CA1;&#x6709;&#x62C9;&#x53D6;&#x5B8C;
                                     //
                                     //  2 &#x63A8;&#x6D41;&#x8FC7;&#x7A0B;&#x4E2D;&#xFF0C;&#x6301;&#x7EED;&#x5220;&#x9664;&#x8FC7;&#x671F;&#x7684;ts&#x6587;&#x4EF6;&#xFF0C;&#x53EA;&#x4FDD;&#x7559;&#x6700;&#x8FD1;&#x7684;
                                     //    delete_threshold + fragment_num + 1
                                     //    &#x4E2A;&#x5DE6;&#x53F3;&#x7684;ts&#x6587;&#x4EF6;
                                     //    &#x5E76;&#x4E14;&#xFF0C;&#x5728;&#x8F93;&#x5165;&#x6D41;&#x7ED3;&#x675F;&#x540E;&#xFF0C;&#x4E5F;&#x4F1A;&#x6267;&#x884C;&#x6E05;&#x7406;&#x6A21;&#x5F0F;1&#x7684;&#x903B;&#x8F91;
                                     //
                                     //  &#x6CE8;&#x610F;&#xFF0C;record.m3u8&#x53EA;&#x5728;0&#x548C;1&#x6A21;&#x5F0F;&#x4E0B;&#x751F;&#x6210;
                                     //
    "use_memory_as_disk_flag": false //. &#x662F;&#x5426;&#x4F7F;&#x7528;&#x5185;&#x5B58;&#x53D6;&#x4EE3;&#x78C1;&#x76D8;&#xFF0C;&#x4FDD;&#x5B58;m3u8+ts&#x6587;&#x4EF6;
                                     //  &#x6CE8;&#x610F;&#xFF0C;&#x4F7F;&#x7528;&#x8BE5;&#x6A21;&#x5F0F;&#x8981;&#x6CE8;&#x610F;&#x5185;&#x5B58;&#x5BB9;&#x91CF;&#x3002;&#x4E00;&#x822C;&#x6765;&#x8BF4;&#x4E0D;&#x5E94;&#x8BE5;&#x642D;&#x914D;cleanup_mode&#x4E3A;0&#x6216;1&#x4F7F;&#x7528;
  },
  "httpts": {
    "enable": true,         //. &#x662F;&#x5426;&#x5F00;&#x542F;HTTP-TS&#x670D;&#x52A1;&#x7684;&#x76D1;&#x542C;&#x3002;&#x6CE8;&#x610F;&#xFF0C;&#x8FD9;&#x5E76;&#x4E0D;&#x662F;HLS&#x4E2D;&#x7684;TS&#xFF0C;&#x800C;&#x662F;&#x5728;&#x4E00;&#x6761;HTTP&#x957F;&#x8FDE;&#x63A5;&#x4E0A;&#x6301;&#x7EED;&#x6027;&#x4F20;&#x8F93;TS&#x6D41;
    "enable_https": true,   //. &#x662F;&#x5426;&#x5F00;&#x542F;HTTPS-TS&#x76D1;&#x542C;
    "url_pattern": "/"      //. &#x62C9;&#x6D41;url&#x8DEF;&#x7531;&#x8DEF;&#x5F84;&#x5730;&#x5740;&#x3002;&#x9ED8;&#x8BA4;&#x503C;&#x4E3A;/&#xFF0C;&#x8868;&#x793A;&#x4E0D;&#x53D7;&#x9650;&#x5236;&#xFF0C;&#x8DEF;&#x7531;&#x5730;&#x5740;&#x53EF;&#x4EE5;&#x4E3A;&#x4EFB;&#x610F;&#x8DEF;&#x5F84;&#x5730;&#x5740;&#x3002;
                            //  &#x5982;&#x679C;&#x8BBE;&#x7F6E;&#x4E3A;/live/&#xFF0C;&#x5219;&#x53EA;&#x80FD;&#x4ECE;/live/&#x8DEF;&#x5F84;&#x4E0B;&#x62C9;&#x6D41;&#xFF0C;&#x6BD4;&#x5982;/live/test110.ts
  },
  "rtsp": {
    "enable": true, //. &#x662F;&#x5426;&#x5F00;&#x542F;rtsp&#x670D;&#x52A1;&#x7684;&#x76D1;&#x542C;&#xFF0C;&#x76EE;&#x524D;&#x53EA;&#x652F;&#x6301;rtsp&#x63A8;&#x6D41;
    "addr": ":5544" //. rtsp&#x63A8;&#x6D41;&#x5730;&#x5740;
  },
  "record": {
    "enable_flv": true,                      //. &#x662F;&#x5426;&#x5F00;&#x542F;flv&#x5F55;&#x5236;
    "flv_out_path": "./lal_record/flv/",     //. flv&#x5F55;&#x5236;&#x76EE;&#x5F55;
    "enable_mpegts": true,                   //. &#x662F;&#x5426;&#x5F00;&#x542F;mpegts&#x5F55;&#x5236;&#x3002;&#x6CE8;&#x610F;&#xFF0C;&#x6B64;&#x5904;&#x662F;&#x957F;ts&#x6587;&#x4EF6;&#x5F55;&#x5236;&#xFF0C;hls&#x5F55;&#x5236;&#x7531;&#x4E0A;&#x9762;&#x7684;hls&#x914D;&#x7F6E;&#x63A7;&#x5236;
    "mpegts_out_path": "./lal_record/mpegts" //. mpegts&#x5F55;&#x5236;&#x76EE;&#x5F55;
  },
  "relay_push": {
    "enable": false, //. &#x662F;&#x5426;&#x5F00;&#x542F;&#x4E2D;&#x7EE7;&#x8F6C;&#x63A8;&#x529F;&#x80FD;&#xFF0C;&#x5F00;&#x542F;&#x540E;&#xFF0C;&#x81EA;&#x8EAB;&#x63A5;&#x6536;&#x5230;&#x7684;&#x6240;&#x6709;&#x6D41;&#x90FD;&#x4F1A;&#x8F6C;&#x63A8;&#x51FA;&#x53BB;
    "addr_list":[    //. &#x4E2D;&#x7EE7;&#x8F6C;&#x63A8;&#x7684;&#x5BF9;&#x7AEF;&#x5730;&#x5740;&#xFF0C;&#x652F;&#x6301;&#x586B;&#x5199;&#x591A;&#x4E2A;&#x5730;&#x5740;&#xFF0C;&#x505A;1&#x5BF9;n&#x7684;&#x8F6C;&#x63A8;&#x3002;&#x683C;&#x5F0F;&#x4E3E;&#x4F8B; "127.0.0.1:19351"
    ]
  },
  "relay_pull": {
    "enable": false, //. &#x662F;&#x5426;&#x5F00;&#x542F;&#x56DE;&#x6E90;&#x62C9;&#x6D41;&#x529F;&#x80FD;&#xFF0C;&#x5F00;&#x542F;&#x540E;&#xFF0C;&#x5F53;&#x81EA;&#x8EAB;&#x63A5;&#x6536;&#x5230;&#x62C9;&#x6D41;&#x8BF7;&#x6C42;&#xFF0C;&#x800C;&#x6D41;&#x4E0D;&#x5B58;&#x5728;&#x65F6;&#xFF0C;&#x4F1A;&#x4ECE;&#x5176;&#x4ED6;&#x670D;&#x52A1;&#x5668;&#x62C9;&#x53D6;&#x8FD9;&#x4E2A;&#x6D41;&#x5230;&#x672C;&#x5730;
    "addr": ""       //. &#x56DE;&#x6E90;&#x62C9;&#x6D41;&#x7684;&#x5730;&#x5740;&#x3002;&#x683C;&#x5F0F;&#x4E3E;&#x4F8B; "127.0.0.1:19351"
  },
  "http_api": {
    "enable": true, //. &#x662F;&#x5426;&#x5F00;&#x542F;HTTP API&#x63A5;&#x53E3;
    "addr": ":8083" //. &#x76D1;&#x542C;&#x5730;&#x5740;
  },
  "server_id": "1", //. &#x5F53;&#x524D;lalserver&#x552F;&#x4E00;ID&#x3002;&#x591A;&#x4E2A;lalserver HTTP Notify&#x540C;&#x4E00;&#x4E2A;&#x5730;&#x5740;&#x65F6;&#xFF0C;&#x53EF;&#x901A;&#x8FC7;&#x8BE5;ID&#x533A;&#x5206;
  "http_notify": {
    "enable": true,                                              //. &#x662F;&#x5426;&#x5F00;&#x542F;HTTP Notify&#x4E8B;&#x4EF6;&#x56DE;&#x8C03;
    "update_interval_sec": 5,                                    //. update&#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x95F4;&#x9694;&#xFF0C;&#x5355;&#x4F4D;&#x6BEB;&#x79D2;
    "on_server_start": "http://127.0.0.1:10101/on_server_start", //. &#x5404;&#x4E8B;&#x4EF6;HTTP Notify&#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x5730;&#x5740;
    "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": {                    // &#x9274;&#x6743;&#x6587;&#x6863;&#x89C1;&#xFF1A; https://pengrl.com/lal/#/auth
    "key": "q191201771",              // &#x79C1;&#x6709;key&#xFF0C;&#x8BA1;&#x7B97;md5&#x9274;&#x6743;&#x53C2;&#x6570;&#x65F6;&#x4F7F;&#x7528;
    "dangerous_lal_secret": "pengrl", // &#x540E;&#x95E8;&#x9274;&#x6743;&#x53C2;&#x6570;&#xFF0C;&#x6240;&#x6709;&#x7684;&#x6D41;&#x53EF;&#x901A;&#x8FC7;&#x8BE5;&#x53C2;&#x6570;&#x503C;&#x9274;&#x6743;
    "pub_rtmp_enable": false,         // rtmp&#x63A8;&#x6D41;&#x662F;&#x5426;&#x5F00;&#x542F;&#x9274;&#x6743;&#xFF0C;true&#x4E3A;&#x5F00;&#x542F;&#x9274;&#x6743;&#xFF0C;false&#x4E3A;&#x4E0D;&#x5F00;&#x542F;&#x9274;&#x6743;
    "sub_rtmp_enable": false,         // rtmp&#x62C9;&#x6D41;&#x662F;&#x5426;&#x5F00;&#x542F;&#x9274;&#x6743;
    "sub_httpflv_enable": false,      // httpflv&#x62C9;&#x6D41;&#x662F;&#x5426;&#x5F00;&#x542F;&#x9274;&#x6743;
    "sub_httpts_enable": false,       // httpts&#x62C9;&#x6D41;&#x662F;&#x5426;&#x5F00;&#x542F;&#x9274;&#x6743;
    "pub_rtsp_enable": false,         // rtsp&#x63A8;&#x6D41;&#x662F;&#x5426;&#x5F00;&#x542F;&#x9274;&#x6743;
    "sub_rtsp_enable": false,         // rtsp&#x62C9;&#x6D41;&#x662F;&#x5426;&#x5F00;&#x542F;&#x9274;&#x6743;
    "hls_m3u8_enable": true           // m3u8&#x62C9;&#x6D41;&#x662F;&#x5426;&#x5F00;&#x542F;&#x9274;&#x6743;
  },
  "pprof": {
    "enable": true, //. &#x662F;&#x5426;&#x5F00;&#x542F;Go pprof web&#x670D;&#x52A1;&#x7684;&#x76D1;&#x542C;
    "addr": ":8084" //. Go pprof web&#x5730;&#x5740;
  },
  "log": {
    "level": 1,                         //. &#x65E5;&#x5FD7;&#x7EA7;&#x522B;&#xFF0C;0 trace, 1 debug, 2 info, 3 warn, 4 error, 5 fatal
    "filename": "./logs/lalserver.log", //. &#x65E5;&#x5FD7;&#x8F93;&#x51FA;&#x6587;&#x4EF6;
    "is_to_stdout": true,               //. &#x662F;&#x5426;&#x6253;&#x5370;&#x81F3;&#x6807;&#x5FD7;&#x63A7;&#x5236;&#x53F0;&#x8F93;&#x51FA;
    "is_rotate_daily": true,            //. &#x65E5;&#x5FD7;&#x6309;&#x5929;&#x7FFB;&#x6EDA;
    "short_file_flag": true,            //. &#x65E5;&#x5FD7;&#x672B;&#x5C3E;&#x662F;&#x5426;&#x643A;&#x5E26;&#x6E90;&#x7801;&#x6587;&#x4EF6;&#x540D;&#x4EE5;&#x53CA;&#x884C;&#x53F7;&#x7684;&#x4FE1;&#x606F;
    "assert_behavior": 1                //. &#x65E5;&#x5FD7;&#x65AD;&#x8A00;&#x7684;&#x884C;&#x4E3A;&#xFF0C;1 &#x53EA;&#x6253;&#x5370;&#x9519;&#x8BEF;&#x65E5;&#x5FD7; 2 &#x6253;&#x5370;&#x5E76;&#x9000;&#x51FA;&#x7A0B;&#x5E8F; 3 &#x6253;&#x5370;&#x5E76;panic
  },
  "debug": {
    "log_group_interval_sec": 30,          // &#x6253;&#x5370;group&#x8C03;&#x8BD5;&#x65E5;&#x5FD7;&#x7684;&#x95F4;&#x9694;&#x65F6;&#x95F4;&#xFF0C;&#x5355;&#x4F4D;&#x79D2;&#x3002;&#x5982;&#x679C;&#x4E3A;0&#xFF0C;&#x5219;&#x4E0D;&#x6253;&#x5370;
    "log_group_max_group_num": 10,         // &#x6700;&#x591A;&#x6253;&#x5370;&#x591A;&#x5C11;&#x4E2A;group
    "log_group_max_sub_num_per_group": 10  // &#x6BCF;&#x4E2A;group&#x6700;&#x591A;&#x6253;&#x5370;&#x591A;&#x5C11;&#x4E2A;sub session
  }
}
</fragment_num>

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

六. 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的时间戳)后另存文件

(更具体的功能参加各源码文件的头部说明)

七. 联系作者

欢迎任何技术和非技术的交流。

Original: https://www.cnblogs.com/notokoy/p/15987283.html
Author: 就想叫yoko
Title: Golang开源流媒体服务器(RTMP/RTSP/HLS/FLV等协议)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/516402/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球