介绍
服务提供商如 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
,然后在提示时按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
你会看到一些输出,因为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 流. 如果您有本地安装的 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 后,配置它意味着定制您想要添加到流媒体的桌面窗口和音频源,然后为流媒体服务添加凭证。本教程不会涵盖您的流媒体配置,因为它是偏好,默认情况下,您可以通过流媒体整个桌面进行工作演示。为了设置流媒体服务凭证,打开 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上实现的,通过使用您在本教程中探索的方法,您可以通过其他广播服务提供流,或以您选择的任何其他方式曝光它。