利用Docker极速搭建RTMP/hls 服务器

前言

虽然说我一直致力于推动Tkong又更多原创的内容,比如这篇文章,但作为仍然以媒体内容支撑的主体,多媒体的展示方式似乎更重要。

对于流的传输从hls(m3u8)到Flv 再到Rtmp,多种不同的格式和传输,不同的切片方式,但hls脱颖而出。因为hls可以聚集在任何设备播放,只要加载hls.js 即可

本篇文章将通过Docker部署来实现如下内容:

  • Rtmp 推流
  • Rtmp、hls 拉流
  • 自动化清晰度和传输速率调整
  • 对于流的管理防止盗播

部署

本文章的内容都是基于 Ubuntu 来搭建,其他的系统毅然也支持,Windows 和 Mac OS也是支持的,但可能并不与本文章完全一致。

我所利用的伺服器作业系统为Ubuntu 20.0,但事实上能够运行Docker的设备均可运行,不过我们首先要挑选两个开放端口,分别对应Pull与Push。在下文中我选取了8080作为Pull 1935作为Push。

安装Docker 较新的版本

这里我推荐使用主流Linux或者Mac,Windows 某些设备的UFN默认关闭了虚拟化,在Windows运行Docker需要Hyper-v的打开。

在宝塔面板当中可以直接通过软件中心下载,这个是无所谓的。你也可以使用官方的命令下载。

(以下都是Ubuntu环境下的安装和命令,如果你是其他发行版,请在官网Docs中寻找答案。https://docs.docker.com/desktop/install/linux-install/

 sudo apt-get update
 sudo apt-get install ./docker-desktop-<version>-<arch>.deb
 systemctl --user start docker-desktop
 systemctl --user enable docker-desktop 

成功安装 Docker Desktop 后,您可以通过运行以下命令来检查这些二进制文件的版本:

$ docker compose version
Docker Compose version v2.18.1
$ docker --version
Docker version 24.0.2, build cb74dfc
$ docker version
Client: Docker Engine - Community
 Version:           24.0.2
 API version:       1.43
〈……〉

Pull Docker镜像并Run

docker pull alfg/nginx-rtmp
docker run -it -p 1935:1935 -p 8080:80 --rm alfg/nginx-rtmp

Docker 运行以后如何进程守护?

我相信您一定需要进程守护,因为您不可能一直打开并连接SSH,当然Windows或是MacOS等图形化界面可以略过,因为一直打开窗口做到进程守护,并不难办到。使用宝塔面板在面板中也自带了进程守护,您也可以直接略过本部分,前往端口映射和转发。

使用 Nohup 命令进行的 进程守护,虽然功能很单一但对于本项目是最简单快捷的方法。

$ nohup <你想守护的程序命令> &
 #接下来按2次Enter即可打下一行命令了,这时候进程已经守护。

使用前的准备

实际上到这个时候RTMP/HLS服务器已经建立起来的,但我相信并不是所有人都希望通过IP+端口的方式直接让其他人访问。如果您完全按照本文章的设置进行的配置,目前RTMP的对外端口应该是1935,而HLS的对外端口是8080。您首先应该检查防火墙是否双向开放了这2个端口的TCP连接。

反向代理 的设置

如果您希望通过域名访问HLS,只需要使用Nginx自带的 反向代理 功能即可,当然宝塔面板中自带了这样设置的图形化界面。配置如下:


location ^~ /
{
    proxy_pass http://localhost:8080/hls/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_http_version 1.1;
    # proxy_hide_header Upgrade;

    add_header X-Cache $upstream_cache_status;
    #Set Nginx Cache

    set $static_filebrGthse5 0;
    if ( $uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$" )
    {
        set $static_filebrGthse5 1;
        expires 1m;
    }
    if ( $static_filebrGthse5 = 0 )
    {
        add_header Cache-Control no-cache;
    }
}

推流的准备

您应该在推流的设备准备一个推流软体,无论是最普遍和开放的 OBS 还是 ffmpeg 都可。

开始使用

推流直播

推流的地址应该是:

rtmp://localhost:1935/stream/$STREAM_NAME

OBS 的设置应该是:

Stream Type: Custom Streaming Server
URL: rtmp://localhost:1935/stream
Stream Key: $STREAM_NAME

观看直播

在浏览器中加载示例 hls.js 播放器:

http://localhost:8080/player.html?url=http://localhost:8080/live/$STREAM_NAME.m3u8

或者在 Safari、VLC 或任何 HLS 播放器中,打开:

  • http://localhost:8080/live/$STREAM_NAME.m3u8
  • 示例播放列表:http://localhost:8080/live/$STREAM_NAME.m3u8
  • FF播放:ffplay -fflags nobuffer rtmp://localhost:1935/stream/$STREAM_NAME
2
0