(Ubuntu)自己搭建直播平台,使用 Nginx RTMP HTTP-FLV,DPlayer播放,支持弹幕Danmaku
系统只因家 Lv114514

前言

最近捣鼓了一下直播,花了差不多半个月的时间吧(开学了搞技术的时间就少),差不多实现了直播推流+拉流和弹幕发送功能,使用Frp内网穿透之后延迟极限可以达到2秒。

想了解各种直播相关协议推荐观看这个视频:

最终效果

也可以到本站直播页观看使用本教程方法搭建的直播平台,不定时开播

视频教程

哔哩哔哩

准备工作(前提条件)

1.一个Linux系统环境,这里推荐Ubuntu

可以使用物理机安装、VMWare虚拟机安装、购买安装Ubuntu系统的VPS、WSL2、手机Termux跑proot/chroot容器等方式运行Ubuntu,具体过程这里就不赘述了

2.国际互联网环境

由于众所周知的原因,可能会遇到无法连接到github或nginx官网的情况,这时候有国际互联网环境就可以完美解决这个问题,工具自找

3.一个公网IP地址(可选,如果你不局限于内网观看直播的话)

要满足这个条件,最简单的,可以使用VPS搭建直播服务器;如果家中有公网IP,可以使用家中设备搭建直播服务器;再不行,可以使用Frp这类型的内网穿透工具来映射至公网(我就使用这种方法)

 

正式部分

编译Nginx

Nginx是目前主流的高性能开源Web服务器,但是原生Nginx并不支持RTMP协议,需要将RTMP模块编译进Nginx

如果之前有安装Nginx最好卸载掉

1
apt autopurge nginx*

1. 安装软件包依赖

复制运行以下命令:

1
2
apt update
apt install wget git tar gcc vim ffmpeg openssl libpcre3-dev zlib1g-dev make libgd-dev libpcre3 libssl-dev

2.下载Nginx源代码

Nginx下载页面下载源码的tar.gz压缩文件,推荐nginx-1.22.0.tar.gz,目前Ubuntu官方软件源中的Nginx就是这个版本,当然你也可以选择更新的

使用命令下载并解压nginx-1.22.0.tar.gz:

1
2
3
4
wget https://nginx.org/download/nginx-1.22.0.tar.gz
tar zxvf nginx-1.22.0.tar.gz
rm nginx-1.22.0.tar.gz
cd nginx-1.22.0

3.下载nginx-http-flv-module

nginx-http-flv-module是一个基于nginx-rtmp-module的第三方模块,包含所有nginx-rtmp-module的功能。项目中文文档

克隆模块仓库

1
git clone https://github.com/winshining/nginx-http-flv-module.git

4.编译并安装

配置编译器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
./configure --prefix=/usr/local/nginx \
--user=$USER \
--with-pcre \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-http_auth_request_module \
--with-http_image_filter_module \
--with-http_slice_module \
--with-mail \
--with-threads \
--with-file-aio \
--with-stream \
--with-mail_ssl_module \
--with-stream_ssl_module \
--add-module=./nginx-http-flv-module

编译并安装

1
2
make
make install

将编译出来的nginx二进制文件链接到/usr/local/sbin/目录中

1
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

查看Nginx版本

1
nginx -v

正常情况下会输出你编译的Nginx版本

nginx version: nginx/1.22.0

配置RTMP推流服务器

使用你喜爱的文本编辑器打开nginx配置文件,我使用vim

1
vim /usr/local/nginx/conf/nginx.conf

在event块和http之间添加rtmp块:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
rtmp {
server {
listen 1935; #监听端口
chunk_size 4096;
application live { #live是直播流应用名,可以改成其它
live on;
meta off; #为了兼容flv.js
hls on;
hls_path /tmp/hls; #hls拉流缓存存放地址
hls_fragment 4;
hls_playlist_length 30; #指定hls_path文件夹中的切片(ts格式)数量
record off;
allow play all; #任何人均可拉流
}
}
}

配置HTTP-FLV和HLS拉流服务器

在配置文件中的http块中添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server {
listen 8080; #监听端口
server_name localhost;

location / {
flv_live on; #打开http-flv服务
chunked_transfer_encoding on;
add_header 'Access-Control-Allow-Origin' '*'; #允许跨域
add_header 'Access-Control-Allow-Credentials' 'true';
}
location /hls { #打开hls服务
add_header 'Access-Control-Allow-Origin' '*'; #允许跨域
add_header 'Access-Control-Allow-Credentials' 'true';
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias /tmp/hls;
expires -1;
}
}

保存退出配置文件,启动Nginx服务器:

1
nginx

测试推流

这里示例使用ffmpeg进行简单推流

1
ffmpeg -re -i /root/Videos/test.mp4 -c copy -f flv rtmp://127.0.0.1:1935/live/1

命令解释(ChatGPT生成):

  1. ffmpeg: 这是FFmpeg工具的命令行启动命令,它用于处理多媒体文件。

  2. -re: 这是一个选项,表示以实时模式(real-time)播放输入文件。在实时模式下,FFmpeg会以与视频的帧速率相匹配的速度处理视频,而不是尽可能快地处理它。这通常用于模拟直播流,以防止过快处理视频。

  3. -i /root/Videos/test.mp4: 这是输入文件的路径和名称。在这个例子中,输入文件是位于/root/Videos/目录下的test.mp4文件。

  4. -c copy: 这是一个选项,指定了视频和音频的编解码方式。copy表示将输入文件中的视频和音频以原样复制到输出文件,而不进行任何重新编码。这可以加快处理速度,尤其是当输入文件已经包含所需的编解码格式时。

  5. -f flv: 这是一个选项,指定了输出文件的格式。在这个例子中,输出文件将以Flash视频(FLV)格式保存。

  6. rtmp://127.0.0.1:1935/live/1: 这是输出文件的目标地址。它使用RTMP(Real-Time Messaging Protocol)协议,将处理后的视频数据流推送到本地主机上的RTMP服务器。具体来说,它将数据推送到127.0.0.1(本地主机)的1935端口上的live应用程序,而1是流的名称。这个地址通常用于流媒体服务器,以便将视频流发送到网络上的观众。

命令后边rtmp://127.0.0.1:1935/live/1的“1”叫推流密钥,自建服务器可以随便填写,作用类似于直播房间号,可以使一个应用处理多个直播流

FFmpeg出现比特率、视频速度等信息即为测试推流成功

测试拉流

推荐使用开源的VLC media player

以Windows端的VLC为例,点击左上角的媒体(M),点击打开网络串流(N),然后点击网络(N),在URL栏中输入http://[服务器IP]:8080/?port=1935&app=live&stream=1

这里的port就是服务器中RTMP推流端口,app就是推流应用程序,stream就是房间号(或者叫推流密钥)

点击播放(P),稍等片刻后看到FFmpeg推的视频即为测试拉流成功