如何在 Ubuntu 20.04 上使用 Nginx-RTMP 设置视频流服务器

介绍

服务提供商如 Twitch对于处理网络发现和流媒体社区管理方面非常受欢迎,自由软件如 OBS Studio广泛用于实时组合来自多个不同流源的视频重叠。

在本教程中,您将学习如何配置 Nginx Web 服务器来托管独立的 RTMP 视频流,可以在不同的应用程序中链接和观看。RTMP,即 实时消息协议,定义了大多数互联网视频流的基础知识。

前提条件

要完成本指南,您将需要:

  • 一个 Ubuntu 20.04 服务器和具有 sudo 特权的非根用户. 您可以在我们的 初始服务器设置与 Ubuntu 20.04 指南中了解有关如何设置具有这些特权的用户的更多信息。

本教程将使用位置主域名 your_domain为URL和主机名称。

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

最现代的流媒体工具支持RTMP协议,该协议定义了互联网视频流的基本参数。Nginx网络服务器包含一个模块,允许您从专用URL提供最小配置的RTMP流,就像它默认地提供HTTP访问网页一样。

首先,作为非根用户,运行以下命令来更新您的包列表并安装 Nginx 模块:

1sudo apt update
2sudo apt install libnginx-mod-rtmp

安装该模块不会自动开始提供流,您需要将配置块添加到您的 Nginx 配置文件中,该文件定义了流的可用性。

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

1sudo nano /etc/nginx/nginx.conf
 1[label /etc/nginx/nginx.conf]
 2. . .
 3rtmp {
 4        server {
 5                listen 1935;
 6                chunk_size 4096;
 7                allow publish 127.0.0.1;
 8                deny publish all;
 9
10                application live {
11                        live on;
12                        record off;
13                }
14        }
15}

*Listen 1935意味着RTMP会听到1935端口上的连接,这是标准的。 *chunk_size 4096意味着RTMP将发送4KB块的数据,这也是标准的。 *允许发布127.0.0.1拒绝发布所有意味着服务器只允许从同一服务器上发布视频,以避免其他用户推自己的流。

保存并关闭文件. 如果您正在使用nano,请按Ctrl+X,然后在提示时按YEnter

这为您的 RTMP 配置提供了开始。默认情况下,它在端口1935上收听,这意味着您需要在防火墙中打开该端口。

1sudo ufw allow 1935/tcp

现在你可以重新加载 Nginx 与你的更改:

1sudo systemctl reload nginx.service

在下一节中,我们将涵盖从本地和远程来源向您的RTMP服务器流视频。

步骤 2 – 将视频发送到您的 RTMP 服务器

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

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

1sudo apt install python3-pip

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

1sudo pip install youtube-dl

现在你可以使用youtube-dl从YouTube下载视频. 如果你没有一个在脑海中,试试这个视频,介绍DigitalOcean的应用平台:

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

你会看到一些输出,因为youtube-dl将其下载的视频和音频流合并到一个单一的文件中 - 这很正常。

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

您现在应该在当前目录中有一个视频文件,标题如Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv

1sudo apt install ffmpeg

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

1ffmpeg -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 指明输入将被读取在其原始framerate.
  • `-i "Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv"" 指明了我们 input 文件的路径。
  • `-c:v' 设置为"复制",这意味着您正在复制来自YouTube的 v视频格式。
  • -c:a 有其他参数,即 aac -ar 44100 -ac 1,因为您需要将 **audio 重新样本到一个RTMP友好的格式。 aac 是一个广泛支持的音频编码器, 44 100hz 是一个常见的频率,而-ac 1`

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

<$>[注] **注:**您可以从 ffmprovisr),一个社区维护的ffmpeg命令示例目录中了解更多关于ffmpeg选项的信息,或者参阅 官方文档

虽然ffmpeg正在播放视频,但它会打印时间代码:

1[secondary_label Output]
2frame=  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输出。如果您正在将视频转换为另一个格式,这些可能会有助于了解视频的重新样本的效率,但在这种情况下,您只想看到它正在连续播放。

当 ffmpeg 运行时,您可以从视频播放器连接到您的 RTMP 流. 如果您有本地安装的 VLCmpv 或其他媒体播放器,您应该能够通过在媒体播放器中打开 URL `rtmp://your_domain/live/stream' 来查看您的流。

<$>[注] 注: 您也可以直接流到,例如,Facebook Live使用ffmpeg,而无需使用 Nginx-RTMP,通过在您的ffmpeg命令中代替rtmp://localhost/live/streamrtmps://live-api-s.facebook.com:443/rtmp/your-facebook-stream-key的方式。 YouTube 使用rtmp://a.rtmp.youtube.com/live2等 URL。

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

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

通过ffmpeg的流媒体是方便的,当你有一个准备的视频,你想播放,但直播可以更有活力. 最流行的软件直播是 OBS,或开放广播软件 – 它是免费的,开源,非常强大的。

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

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

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

obs_stream是一个任意选择的路径 - 在这种情况下,您的视频将在rtmp://your_domain/live/obs_stream上可用。

回到服务器上,打开 Nginx 的主要配置文件, /etc/nginx/nginx.conf,并为您的本地 IP 地址添加额外的 允许发布` 条目。

1sudo nano /etc/nginx/nginx.conf
1[label /etc/nginx/nginx.conf]
2. . .
3                allow publish 127.0.0.1;
4                allow publish your_local_ip_address;
5                deny publish all;
6. . .

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

1sudo systemctl reload nginx.service

您现在应该能够关闭OBS的设置菜单并从主界面点击开始流媒体!尝试像以前一样在媒体播放器中观看流媒体。

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

现在你已经配置了 Nginx 以使用 Nginx-RTMP 模块播放视频,一个常见的下一步是启用 RTMP 统计页面,而不是将更多和更多配置细节添加到你的主要 'nginx.conf' 文件中, Nginx 允许你在名为'sites-available/' 的子目录中添加每个站点的配置。

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

添加以下内容:

 1[label /etc/nginx/sites-available/rtmp]
 2server {
 3    listen 8080;
 4    server_name localhost;
 5
 6    # rtmp stat
 7    location /stat {
 8        rtmp_stat all;
 9        rtmp_stat_stylesheet stat.xsl;
10    }
11    location /stat.xsl {
12        root /var/www/html/rtmp;
13    }
14
15    # rtmp control
16    location /control {
17        rtmp_control all;
18    }
19}

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

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

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

最后,要访问您所添加的统计页面,您需要在防火墙中打开另一个端口。具体来说,倾听指令配置为端口8080,因此您需要添加一个规则来访问该端口的 Nginx。

1sudo ufw allow from your_ip_address to any port http-alt

接下来,您需要激活这个新配置。Nginx的惯例是创建符号链接(如快捷键)从可用网站中的文件到另一个名为可用网站的文件夹,当您决定激活或禁用它们时。

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

现在你可以重新加载 Nginx 来处理你的更改:

1sudo systemctl reload nginx.service

您现在应该能够在浏览器中访问 http://your_domain:8080/stat 以查看 RTMP 统计页面. 访问并更新该页面,同时流视频并观看流量统计数据的变化。

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

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

作为最后一步,您可能想添加对更新的流媒体协议的支持,以便用户可以直接使用 Web 浏览器从您的服务器中流视频. 您可以使用两种协议来创建基于 HTTP 的视频流:苹果的 HLS和MPEG DASH

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

1sudo nano /etc/nginx/nginx.conf
 1[label /etc/nginx/nginx.conf]
 2. . .
 3rtmp {
 4        server {
 5. . .
 6                application live {
 7                    	live on;
 8                    	record off;
 9                        hls on;
10                        hls_path /var/www/html/stream/hls;
11                        hls_fragment 3;
12                        hls_playlist_length 60;
13
14                        dash on;
15                        dash_path /var/www/html/stream/dash;
16                }
17        }
18}
19. . .

保存并关闭文件 接下来,将此添加到您的可用网站/rtmp的底部:

1sudo nano /etc/nginx/sites-available/rtmp
 1[label /etc/nginx/sites-available/rtmp]
 2. . .
 3server {
 4    listen 8088;
 5
 6    location / {
 7        add_header Access-Control-Allow-Origin *;
 8        root /var/www/html/stream;
 9    }
10}
11
12types {
13    application/dash+xml mpd;
14}

<$>[注] 注: Access-Control-Allow-Origin * 标题允许 CORS,或 Cross-Origin Resource Sharing,默认情况下被禁用。这会向从您的服务器获取数据的任何网页浏览器传达消息,即服务器可以从其他端口或域加载资源。

请注意,您在这里使用端口 8088,这是本教程的另一个任意选择,以避免与您可能在端口 80 或 443 上运行的任何服务发生冲突。

1sudo ufw allow 8088/tcp

最后,在您的 Web 根中创建一个目录以匹配配置块,以便 Nginx 能够生成 HLS 和 DASH 所需的文件:

1sudo mkdir /var/www/html/stream

重新加载 Nginx:

1sudo systemctl reload nginx

你现在应该有一个 HLS 流在 http://your_domain:8088/hls/stream.m3u8和一个 DASH 流在 http://your_domain:8088/dash/stream.mpd

结论

您在本教程中使用的配置选项都记录在 Nginx RTMP Wiki 页面中。 Nginx 模块通常共享共同的语法,并暴露了一组非常大的配置选项,您可以查看他们的文档,从这里更改您的任何设置。

几乎所有互联网视频流都是在RTMP、HLS和DASH上实现的,通过使用您在本教程中探索的方法,您可以通过其他广播服务提供流,或以您选择的任何其他方式曝光它。

Published At
Categories with 技术
comments powered by Disqus