如何在Ubuntu20.04上使用Nginx-RTMP设置视频流服务器

来自菜鸟教程
跳转至:导航、​搜索

介绍

流式视频有很多用例。 Twitch 等服务提供商在处理流媒体的网络发现和社区管理方面非常受欢迎,而 OBS Studio 等免费软件被广泛用于组合来自多个不同流的视频叠加层实时来源。 虽然这些平台非常强大,但在某些情况下,您可能希望能够托管不依赖其他服务提供商的流。

在本教程中,您将学习如何配置 Nginx Web 服务器以托管可以在不同应用程序中链接和查看的独立 RTMP 视频流。 RTMP,即 实时消息传递协议 ,定义了大多数互联网视频流的基础。 您还将学习如何使用相同的技术托管支持更现代平台的 HLS 和 DASH 流。

先决条件

要完成本指南,您需要:

本教程将使用占位符域名 your_domain 作为 URL 和主机名。 在学习本教程时,请用您自己的域名或 IP 地址替换它。

第 1 步 — 安装和配置 Nginx-RTMP

大多数现代流媒体工具都支持 RTMP 协议,该协议定义了互联网视频流的基本参数。 Nginx Web 服务器包含一个模块,允许您从专用 URL 提供具有最少配置的 RTMP 流,就像它默认提供对网页的 HTTP 访问一样。 Nginx RTMP 模块不会自动包含在 Nginx 中,但在 Ubuntu 20.04 和大多数其他 Linux 发行版上,您可以将其作为附加包安装。

首先以非 root 用户身份运行以下命令来更新您的软件包列表并安装 Nginx 模块:

sudo apt update
sudo apt install libnginx-mod-rtmp

安装模块不会自动开始提供流。 您需要在 Nginx 配置文件中添加一个配置块,用于定义流可用的位置和方式。

使用 nano 或您喜欢的文本编辑器,打开 Nginx 的主配置文件 /etc/nginx/nginx.conf,并将此配置块添加到文件末尾:

sudo nano /etc/nginx/nginx.conf

/etc/nginx/nginx.conf

. . .
rtmp {
        server {
                listen 1935;
                chunk_size 4096;
                allow publish 127.0.0.1;
                deny publish all;

                application live {
                        live on;
                        record off;
                }
        }
}
  • listen 1935 表示 RTMP 将监听端口 1935 上的连接,这是标准的。
  • chunk_size 4096 表示 RTMP 将以 4KB 块发送数据,这也是标准的。
  • allow publish 127.0.0.1deny publish all 表示服务器将只允许从同一服务器发布视频,以避免任何其他用户推送自己的流。
  • application live 定义将在 /live URL 路径中可用的应用程序块。
  • live on 启用实时模式,以便多个用户可以同时连接到您的流,这是视频流的基线假设。
  • record off 禁用 Nginx-RTMP 的录制功能,因此默认情况下不会将所有流单独保存到磁盘。

保存并关闭文件。 如果您正在使用 nano,请按 Ctrl+X,然后在出现提示时按 Y 并回车。

这提供了您的 RTMP 配置的开始。 默认情况下,它侦听端口 1935,这意味着您需要在防火墙中打开该端口。 如果您将 ufw 配置为初始服务器设置的一部分,请运行以下命令。

sudo ufw allow 1935/tcp

现在您可以使用您的更改重新加载 Nginx:

sudo systemctl reload nginx.service

您现在应该有一个工作的 RTMP 服务器。 在下一节中,我们将介绍从本地和远程源将视频流式传输到您的 RTMP 服务器。

第 2 步 — 将视频发送到您的 RTMP 服务器

有多种方法可以将视频发送到您的 RTMP 服务器。 一种选择是使用 ffmpeg,一种流行的命令行音频-视频实用程序,直接在您的服务器上播放视频文件。 如果服务器上还没有视频文件,可以使用 youtube-dl 下载一个,这是一种用于从 YouTube 等流媒体平台捕获视频的命令行工具。 为了使用 youtube-dl,您还需要在服务器上安装最新的 Python。

首先,安装 Python 及其包管理器 pip

sudo apt install python3-pip

接下来,使用pip安装youtube-dl

pip install youtube-dl

现在您可以使用 youtube-dl 从 YouTube 下载视频。 如果你还没有这个想法,试试这个视频,介绍 DigitalOcean 的应用平台:

youtube-dl https://www.youtube.com/watch?v=iom_nhYQIYk

您会看到一些输出,因为 youtube-dl 将它正在下载的视频和音频流合并到一个文件中——这是正常的。

Output[youtube] iom_nhYQIYk: Downloading webpage
WARNING: Requested formats are incompatible for merge and will be merged into mkv.
[download] Destination: Introducing App Platform by DigitalOcean-iom_nhYQIYk.f137.mp4
[download] 100% of 32.82MiB in 08:40
[download] Destination: Introducing App Platform by DigitalOcean-iom_nhYQIYk.f251.webm
[download] 100% of 1.94MiB in 00:38
[ffmpeg] Merging formats into "Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv"
Deleting original file Introducing App Platform by DigitalOcean-iom_nhYQIYk.f137.mp4 (pass -k to keep)
Deleting original file Introducing App Platform by DigitalOcean-iom_nhYQIYk.f251.webm (pass -k to keep)

您现在应该在当前目录中有一个视频文件,其标题类似于 Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv。 为了流式传输,您需要安装 ffmpeg

sudo apt install ffmpeg

并使用 ffmpeg 将其发送到您的 RTMP 服务器:

ffmpeg -re -i "Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv" -c:v copy -c:a aac -ar 44100 -ac 1 -f flv rtmp://localhost/live/stream

这个 ffmpeg 命令正在做一些事情来为流媒体友好格式准备视频。 这不是 ffmpeg 教程,所以你不需要仔细检查它,但你可以理解如下的各种选项:

  • -re 指定将以其本机帧速率读取输入。
  • -i "Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv" 指定了我们的 input 文件的路径。
  • -c:v 设置为 copy,这意味着您正在复制您从 YouTube 本地获得的 video 格式。
  • -c:a 有其他参数,即 aac -ar 44100 -ac 1,因为您需要将 a 音频重新采样为 RTMP 友好格式。 aac 是广泛支持的音频编解码器,44100 hz 是常用频率,-ac 1 指定 AAC 规范的第一个版本以实现兼容性。
  • -f flv 将视频包装在 flv 格式容器中,以最大程度地兼容 RTMP。

视频被发送到 rtmp://localhost/live/stream 因为您在步骤 1 中定义了 live 配置块,并且 stream 是该视频的任意选择的 URL。

注意:你可以从ffmprovisr,一个社区维护的ffmpeg命令示例目录中了解更多关于ffmpeg选项,或者参考 [1]官方文档]。


ffmpeg 正在流式传输视频时,它将打印时间码:

Outputframe=  127 fps= 25 q=-1.0 size=     405kB time=00:00:05.00 bitrate= 662.2kbits/s speed=frame=  140 fps= 25 q=-1.0 size=     628kB time=00:00:05.52 bitrate= 931.0kbits/s speed=frame=  153 fps= 25 q=-1.0 size=     866kB time=00:00:06.04 bitrate=1173.1kbits/s speed=

这是标准的 ffmpeg 输出。 如果您将视频转换为不同的格式,这些可能有助于了解视频被重新采样的效率,但在这种情况下,您只想看到它被一致地播放。 使用此示例视频,您应该获得精确的 fps= 25 增量。

在 ffmpeg 运行时,您可以从视频播放器连接到您的 RTMP 流。 如果您在本地安装了 VLCmpv 或其他媒体播放器,您应该能够通过在媒体播放器中打开 URL rtmp://your_domain/live/stream 来查看您的流。 在 ffmpeg 播放完视频后,您的流将终止。 如果你想让它无限循环,你可以将 -stream_loop -1 添加到 ffmpeg 命令的开头。

注意: 您也可以直接使用 ffmpeg 直接流式传输到 Facebook Live,而无需使用 Nginx-RTMP,只需将 rtmp://localhost/live/stream 替换为 [ X167X] 命令与 rtmps://live-api-s.facebook.com:443/rtmp/your-facebook-stream-key。 YouTube 使用 rtmp://a.rtmp.youtube.com/live2 等 URL。 可以使用 RTMP 流的其他流媒体提供程序的行为应该类似。


现在您已经学会了从命令行流式传输静态视频源,您将学习如何在桌面上使用 OBS 从动态源流式传输视频。

第 3 步 — 通过 OBS 将视频流式传输到您的服务器(可选)

当您准备好要播放的视频时,通过 ffmpeg 进行流式传输很方便,但实时流式传输可以更加动态。 最流行的直播软件是 OBS,或 Open Broadcaster Software – 它是免费的、开源的并且非常强大。

OBS 是一个桌面应用程序,将从您的本地计算机连接到您的服务器。

安装 OBS 后,配置它意味着自定义要添加到流中的桌面窗口和音频源,然后为流服务添加凭据。 本教程不会涵盖您的流式传输配置,因为它取决于偏好,默认情况下,您可以通过流式传输整个桌面来进行工作演示。 为了设置您的流媒体服务凭证,打开 OBS 的设置菜单,导航到 Stream 选项并输入以下选项:

Streaming Service: Custom
Server: rtmp://your_domain/live
Play Path/Stream Key: obs_stream

obs_stream 是任意选择的路径 - 在这种情况下,您的视频将在 rtmp://your_domain/live/obs_stream 上可用。 您不需要启用身份验证,但需要向您在步骤 1 中配置的 IP 白名单添加一个附加条目。

回到服务器上,打开 Nginx 的主配置文件 /etc/nginx/nginx.conf,并为您的本地 IP 地址添加一个额外的 allow publish 条目。 如果您不知道您的本地 IP 地址,最好只访问 What's my IP 之类的网站,它可以告诉您从哪里访问它:

sudo nano /etc/nginx/nginx.conf

/etc/nginx/nginx.conf

. . .
                allow publish 127.0.0.1;
                allow publish your_local_ip_address;
                deny publish all;
. . .

保存并关闭文件,然后重新加载 Nginx:

sudo systemctl reload nginx.service

您现在应该可以关闭 OBS 的设置菜单,然后从主界面单击 Start Streaming! 尝试像以前一样在媒体播放器中查看您的流。 现在您已经了解了流式视频的基本原理,您可以向服务器添加一些其他功能,使其更适合生产。

第 4 步 — 将监控添加到您的配置中(可选)

现在您已将 Nginx 配置为使用 Nginx-RTMP 模块流式传输视频,接下来的常见步骤是启用 RTMP 统计页面。 Nginx 允许您将每个站点的配置添加到名为 sites-available/ 的子目录中的单个文件中,而不是向您的主 nginx.conf 文件添加越来越多的配置细节。 在这种情况下,您将创建一个名为 rtmp 的文件:

sudo nano /etc/nginx/sites-available/rtmp

添加以下内容:

/etc/nginx/sites-available/rtmp

server {
    listen 8080;
    server_name  localhost;

    # rtmp stat
    location /stat {
        rtmp_stat all;
        rtmp_stat_stylesheet stat.xsl;
    }
    location /stat.xsl {
        root /var/www/html/rtmp;
    }

    # rtmp control
    location /control {
        rtmp_control all;
    }
}

保存并关闭文件。 此配置块中的 stat.xsl 文件用于在浏览器中设置和显示 RTMP 统计页面的样式。 它由您之前安装的 libnginx-mod-rtmp 库提供,但默认情况下它是压缩的,因此您需要将其解压缩并放入 /var/www/html/rtmp 目录以匹配上述配置。 请注意,您可以在 Nginx-RTMP 文档 中找到有关任何这些选项的更多信息。

创建/var/www/html/rtmp目录,然后使用以下命令解压stat.xsl.gz文件:

sudo mkdir /var/www/html/rtmp
sudo gunzip -c /usr/share/doc/libnginx-mod-rtmp/examples/stat.xsl.gz > /var/www/html/rtmp/stat.xsl`

最后,要访问您添加的统计页面,您需要在防火墙中打开另一个端口。 具体来说,listen 指令配置了端口 8080,因此您需要添加一个规则来访问该端口上的 Nginx。 但是,您可能不希望其他人能够访问您的统计页面,因此最好只允许您自己的 IP 地址访问。 运行以下命令:

sudo ufw allow from your_ip_address to any port http-alt

接下来,您需要激活此新配置。 Nginx 的约定是在您决定启用或禁用它们时从 sites-available/ 中的文件创建符号链接(如快捷方式)到另一个名为 sites-enabled/ 的文件夹。 为了清楚起见,使用完整路径,制作该链接:

sudo ln -s /etc/nginx/sites-available/rtmp /etc/nginx/sites-enabled/rtmp

现在您可以再次重新加载 Nginx 以处理您的更改:

sudo systemctl reload nginx.service

您现在应该可以在浏览器中转到 http://your_domain:8080/stat 以查看 RTMP 统计页面。 在流式传输视频时访问并刷新页面,并观察流式统计数据的变化。

您现在已经了解了如何监控您的视频流并将其推送给第三方提供商。 在最后一部分中,您将学习如何在不使用第三方流媒体平台或独立媒体播放器应用程序的情况下直接在浏览器中提供它。

第 5 步 — 为浏览器创建现代流(可选)

作为最后一步,您可能希望添加对更新的流式传输协议的支持,以便用户可以直接使用 Web 浏览器从您的服务器流式传输视频。 您可以使用两种协议来创建基于 HTTP 的视频流:Apple 的 HLS 和 MPEG DASH。 它们都有优点和缺点,因此您可能希望同时支持两者。

Nginx-RTMP 模块支持这两种标准。 要将 HLS 和 DASH 支持添加到您的服务器,您需要修改 nginx.conf 文件中的 rtmp 块。 使用 nano 或您喜欢的编辑器打开 /etc/nginx/nginx.conf,然后添加以下突出显示的指令:

sudo nano /etc/nginx/nginx.conf

/etc/nginx/nginx.conf

. . .
rtmp {
        server {
. . .
                application live {
                        live on;
                        record off;
                        hls on;
                        hls_path /var/www/html/stream/hls;
                        hls_fragment 3;
                        hls_playlist_length 60;

                        dash on;
                        dash_path /var/www/html/stream/dash;
                }
        }
}
. . .

保存并关闭文件。 接下来,将其添加到 sites-available/rtmp 的底部:

sudo nano /etc/nginx/sites-available/rtmp

/etc/nginx/sites-available/rtmp

. . .
server {
    listen 8088;

    location / {
        add_header Access-Control-Allow-Origin *;
        root /var/www/html/stream;
    }
}

types {
    application/dash+xml mpd;
}

注意: Access-Control-Allow-Origin *头启用CORS,或跨域资源共享,默认禁用。 这与从您的服务器访问数据的任何 Web 浏览器进行通信,服务器可能会从其他端口或域加载资源。 需要 CORS 以最大程度地兼容 HLS 和 DASH 客户端 ,以及许多其他 Web 部署中的通用配置切换。


保存并关闭文件。 请注意,您在此处使用端口 8088,这是本教程的另一个任意选择,以避免与您可能在端口 80 或 443 上运行的任何服务发生冲突。 您现在也需要在防火墙中打开该端口:

sudo ufw allow 8088/tcp

最后,在你的 web 根目录下创建一个 stream 目录来匹配配置块,这样 Nginx 就可以为 HLS 和 DASH 生成必要的文件:

sudo mkdir /var/www/html/stream

再次重新加载 Nginx:

sudo systemctl reload nginx

您现在应该在 http://your_domain:8088/hls/stream.m3u8 上有一个可用的 HLS 流,在 http://your_domain:8088/dash/stream.mpd 上应该有一个 DASH 流。 这些端点将在您的 RTMP 视频源之上生成任何必要的元数据,以支持现代 API。

结论

您在本教程中使用的配置选项都记录在 Nginx RTMP Wiki 页面 中。 Nginx 模块通常共享通用语法并公开大量配置选项,您可以查看它们的文档以从此处更改任何设置。

几乎所有互联网视频流都是在 RTMP、HLS 和 DASH 之上实现的,通过使用您在本教程中探索的方法,您可以通过其他广播服务提供您的流,或以您选择的任何其他方式公开它。 接下来,您可以考虑将 Nginx 配置为 反向代理 ,以使这些不同的视频端点中的一些可用作子域。