介绍
服务提供商如 Twitch对于处理网络发现和流媒体社区管理方面非常受欢迎,自由软件如 OBS Studio广泛用于实时组合来自多个不同流源的视频重叠。
在本教程中,您将学习如何配置 Nginx Web 服务器来托管独立的 RTMP 视频流,可以在不同的应用程序中链接和观看。RTMP,即 实时消息协议,定义了大多数互联网视频流的基础知识。
前提条件
要完成本指南,您将需要:
- 具有
sudo
特权的 Ubuntu 22.04 服务器和非root 用户. 您可以了解更多关于如何设置具有这些特权的用户在我们的 初始服务器设置与 Ubuntu 22.04 指南中。 - Nginx 安装,如下 如何在 Ubuntu 22.04上安装 Nginx)。
本教程将使用位置主域名 your_domain为URL和主机名称。
步骤 1 — 安装和配置 Nginx-RTMP
最现代的流媒体工具支持RTMP协议,该协议定义了互联网视频流的基本参数。Nginx网页服务器包含一个模块,允许您从专用URL提供最小配置的RTMP流,类似于它默认地提供HTTP访问网页的方式。
开始使用以下命令作为非root用户来更新您的包列表并安装 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 块发送数据,这也是标准的。allow publish 127.0.0.1
和ney publish all
意味着服务器只允许从同一服务器上发布视频,以避免其他用户推自己的流程。
保存并关闭文件. 如果您正在使用nano
,请按CTRL+X
,然后在提示时按Y
和ENTER
。
这为您的 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 -f mp4
<$>[注] 注: 有时,你会遇到一个错误,说‘错误:无法下载视频数据:HTTP错误403:禁止’。如果你这样做,请双重检查你有正确的URL。
您的输出将返回youtube-dl
,将其下载的视频和音频流合并到一个单个文件中,这是正常的:
1[secondary_label Output]
2[youtube] iom_nhYQIYk: Downloading webpage
3[download] Destination: Introducing App Platform by DigitalOcean-iom_nhYQIYk.mp4
4[download] 100% of 7.90MiB in 01:39
您现在在当前目录中有一个视频文件,标题如Introducing App Platform by DigitalOcean-iom_nhYQIYk.mp4
。
1sudo apt install ffmpeg
并使用ffmpeg
将其发送到您的RTMP服务器:
1ffmpeg -re -i "Introducing App Platform by DigitalOcean-iom_nhYQIYk.mp4" -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.mp4"" 指明到我们的 input 文件的路径。
-c:v' 设置为
复制',这意味着您正在复制来自 YouTube 的 v 视频格式。-c:a
有其他参数,即aac -ar 44100 -ac 1
,因为您需要将 a 音频重新样本到 RTMP 友好的格式。aac
是一个广泛支持的音频编码器,44
100hz 是一个常见的频率,而
-ac 1`
视频被发送到rtmp://localhost/live/stream
,因为您在 Step 1中定义了live
配置块,而stream
是此视频的任意选择的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 流. 如果您有本地安装的 VLC
、 mpv
或其他媒体播放器,您应该能够通过在媒体播放器中打开 URL `rtmp://your_domain/live/stream' 来查看您的流。
<$>[注]
注: 您也可以直接流到,例如,Facebook Live使用ffmpeg
,而无需使用 Nginx-RTMP,通过在您的ffmpeg
命令中代替rtmp://localhost/live/stream
以rtmps://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 后,配置它意味着定制您想要添加到您的流媒体的桌面窗口和音频源,然后为流媒体服务添加凭证。本教程不会涵盖您的流媒体配置,因为它是偏好,默认情况下,您可以通过仅通过流媒体整个桌面进行工作演示。
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的设置菜单并从主界面点击开始流媒体!
尝试在媒体播放器中像以前那样在rtmp://your_domain/live/obs_stream
查看流媒体。
步骤 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 cp /usr/share/doc/libnginx-mod-rtmp/examples/stat.xsl /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上实现的,通过使用您在本教程中探索的方法,您可以通过其他广播服务提供流,或以您选择的任何其他方式曝光它。