流媒体视频有很多用例。服务提供商如Twitch在处理流媒体的网络发现和社区管理方面非常受欢迎,并且免费软件,例如OBS工作室广泛用于实时组合来自多个不同流源的视频叠加。虽然这些平台非常强大,但在某些情况下,您可能希望能够托管不依赖其他服务提供商的流。
在本教程中,您将学习如何配置 Nginx Web 服务器来托管可以在不同应用程序中链接和查看的独立 RTMP 视频流。 RTMP,实时消息传递协议,定义了大多数互联网视频流的基础知识。您还将了解如何使用相同技术托管支持更现代平台的 HLS 和 DASH 流。
要完成本指南,您将需要:
- 一台 Ubuntu 22.04 服务器和一台非root用户与
sudo
特权。您可以在我们的文章中详细了解如何设置具有这些权限的用户使用 Ubuntu 22.04 进行初始服务器设置 guide.
- Nginx已安装,如下如何在 Ubuntu 22.04 上安装 Nginx.
本教程将使用占位符域名你的域名对于 URL 和主机名。在学习本教程时,将其替换为您自己的域名或 IP 地址。
大多数现代流媒体工具都支持 RTMP 协议,该协议定义了互联网视频流的基本参数。 Nginx Web 服务器包含一个模块,允许您通过专用 URL 以最少的配置提供 RTMP 流,类似于默认情况下提供对网页的 HTTP 访问的方式。 Nginx RTMP 模块不会自动包含在 Nginx 中,但在 Ubuntu 22.04 和大多数其他 Linux 发行版上,您可以将其作为附加包安装。
首先运行以下命令作为非root用户更新您的软件包列表并安装 Nginx 模块:
-
sudo apt update
-
sudo apt installlibnginx-mod-rtmp
安装模块不会自动开始提供流。您需要在 Nginx 配置文件中添加一个配置块,用于定义流的可用位置和方式。
Using 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.1
and deny publish all
意味着服务器将只允许从同一服务器发布视频,以避免任何其他用户推送自己的流。
-
application live
定义一个应用程序块,该块将在以下位置可用/live
网址路径。
-
live on
启用实时模式,以便多个用户可以同时连接到您的流,这是视频流的基本假设。
-
record off
禁用 Nginx-RTMP 录制功能,以便默认情况下不会将所有流单独保存到磁盘。
保存并关闭文件。如果您正在使用nano
, press CTRL+X
,然后当出现提示时,Y
and ENTER
.
这就是 RTMP 配置的开始。默认情况下,它监听端口1935
,这意味着您需要在防火墙中打开该端口。如果您配置了ufw
作为初始服务器设置的一部分,运行以下命令:
现在您可以使用更改重新加载 Nginx:
-
sudosystemctl 重新加载 nginx.service
您现在已经有了一个正在运行的 RTMP 服务器。在下一节中,我们将介绍从本地和远程源将视频流传输到 RTMP 服务器。
有多种方法可以将视频发送到 RTMP 服务器。一种选择是使用ffmpeg
,一种流行的命令行音频视频实用程序,可直接在服务器上播放视频文件。如果您的服务器上还没有视频文件,您可以使用以下命令下载一个视频文件youtube-dl
,一个用于从 YouTube 等流媒体平台捕获视频的命令行工具。土濑youtube-dl
,您还需要在服务器上安装最新的 Python。
首先,安装Python及其包管理器,pip
:
-
sudo apt installpython3-pip
接下来,使用pip
安装youtube-dl
:
-
sudo pip installyoutube-dl
现在你可以使用youtube-dl
从 YouTube 下载视频。如果您还没有想到,请尝试观看此视频,其中介绍了DigitalOcean 的应用程序平台:
- youtube-dl https://www.youtube.com/watch?v=iom_nhYQIYk-f mp4
Note:有时,您会遇到这样的错误:ERROR: unable to download video data: HTTP Error 403: Forbidden
。如果这样做,请仔细检查您的 URL 是否正确。如果您的 URL 正确,再次运行该命令即可。这是通过该库与 YouTube 交互的一个怪癖。
您的输出将返回为youtube-dl
,它将下载的视频和音频流合并到一个文件中,这是正常的:
Output
[youtube] iom_nhYQIYk: Downloading webpage
[download] Destination: Introducing App Platform by DigitalOcean-iom_nhYQIYk.mp4
[download] 100% of 7.90MiB in 01:39
现在,您的当前目录中有一个视频文件,其标题如下Introducing App Platform by DigitalOcean-iom_nhYQIYk.mp4
。要流式传输,请安装ffmpeg
:
And use ffmpeg
将其发送到您的 RTMP 服务器:
- ffmpeg -re -i “介绍 DigitalOcean-iom_nhYQIYk.mp4 的应用程序平台” -c:v copy -c:a aac -ar 44100 -ac 1 -fflv rtmp://localhost/live/stream
This ffmpeg
命令正在做一些事情来准备视频以适合流媒体播放的格式。这不是一个ffmpeg
教程,所以你不需要太仔细地检查它,但你可以了解各种选项,如下所示:
-
-re
指定将以其本机帧速率读取输入。
-
-i "Introducing App Platform by DigitalOcean-iom_nhYQIYk.mp4"
指定我们的路径i输入文件。
-
-c:v
被设定为copy
,这意味着您正在复制v您从 YouTube 获取的 ideo 格式。
-
-c:a
还有其他参数,即aac -ar 44100 -ac 1
,因为您需要重新采样a音频转换为 RTMP 友好的格式。aac
是一种广泛支持的音频编解码器,44100
Hz 是常见频率,并且-ac 1
出于兼容性目的指定 AAC 规范的第一个版本。
-
-f flv
将视频包装在flv
格式容器以最大程度地兼容 RTMP。
视频发送至rtmp://localhost/live/stream
因为你定义了live
配置块中Step 1, and stream
是为此视频任意选择的 URL。
Note:您可以了解更多有关ffmpeg
选项来自ffm提供者,社区维护的目录ffmpeg
命令示例,或参考官方文档.
While ffmpeg
正在流式传输视频,它将打印时间码:
Output
frame= 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
增量。
While ffmpeg is running, you can connect to your RTMP stream from a video player. If you have VLC
, mpv
, or another media player installed locally, you should be able to view your stream by opening the URL rtmp://your_domain/live/stream
in your media player. Your stream will terminate after ffmpeg
has finished playing the video. If you want it to keep looping indefinitely, you can add -stream_loop -1
to the beginning of your ffmpeg
command.
Note: You can also stream directly to, for example, Facebook Live using ffmpeg
without needing to use Nginx-RTMP at all by replacing rtmp://localhost/live/stream
in your ffmpeg
command with rtmps://live-api-s.facebook.com:443/rtmp/your-facebook-stream-key
. YouTube uses URLs like rtmp://a.rtmp.youtube.com/live2
. Other streaming providers that can consume RTMP streams should behave similarly.
现在您已经学会了从命令行流式传输静态视频源,接下来您将学习如何在桌面上使用 OBS 从动态源流式传输视频。
流媒体通过ffmpeg
当您准备好要播放的视频时,这很方便,但实时流媒体可以更加动态。最流行的直播软件是OBS,或开放广播软件——它是免费的、开源的,而且非常强大。
OBS 是一个桌面应用程序,将从您的本地计算机连接到您的服务器。
安装 OBS 后,配置它意味着自定义要添加到流中的桌面窗口和音频源,然后添加流服务的凭据。本教程不会涵盖您的流式传输配置,因为它取决于偏好,并且默认情况下,您可以通过仅流式传输整个桌面来获得工作演示。要设置流媒体服务凭据,请打开 OBS 的设置菜单,导航至Stream选项并输入以下选项:
Streaming Service: Custom
Server: rtmp://your_domain/live
Play Path/Stream Key: obs_stream
obs_stream
is an arbitrarily chosen path,in this case, your video would be available at rtmp://your_domain/live/obs_stream
. You do not need to enable authentication, but you do need to add an additional entry to the IP whitelist that you configured in Step 1.
回到服务器,打开Nginx的主配置文件,/etc/nginx/nginx.conf
,并添加一个额外的allow publish
您的本地 IP 地址条目。如果您不知道本地 IP 地址,最好访问以下网站我的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:
-
sudosystemctl 重新加载 nginx.service
You should now be able to close OBS’s settings menu and click Start Streaming
from the main interface! Try viewing your stream at rtmp://your_domain/live/obs_stream
in a media player as before. Now that you understand the fundamentals of streaming video in action, you can add a few other features to your server to make it more production-ready.
现在您已将 Nginx 配置为使用 Nginx-RTMP 模块流式传输视频,下一步常见的步骤是启用 RTMP 统计页面。而不是向您的 main 添加越来越多的配置详细信息nginx.conf
文件中,Nginx 允许您将每个站点的配置添加到名为的子目录中的各个文件中sites-available/
。在这种情况下,您将创建一个名为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 cp/usr/share/doc/libnginx-mod-rtmp/examples/stat.xsl /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 来处理您的更改:
-
sudosystemctl 重新加载 nginx.service
You should now be able to go to http://your_domain:8080/stat
in a browser to check out the RTMP statistics page. Visit and refresh the page while streaming video and watch as the stream statistics change.
您现在已经了解了如何监控视频流并将其推送给第三方提供商。在最后一部分中,您将学习如何直接在浏览器中提供它,而不使用第三方流媒体平台或独立的媒体播放器应用程序。
最后一步,您可能需要添加对较新的流媒体协议的支持,以便用户可以直接使用 Web 浏览器从您的服务器流式传输视频。您可以使用两种协议来创建基于 HTTP 的视频流: Apple 的HLS和MPEGDASH。它们都有优点和缺点,因此您可能想同时支持两者。
Nginx-RTMP 模块支持这两种标准。要向您的服务器添加 HLS 和 DASH 支持,您需要修改rtmp
阻止你的nginx.conf
文件。打开/etc/nginx/nginx.conf
using nano
或您喜欢的编辑器,然后添加以下突出显示的指令:
-
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;
}
Note: The Access-Control-Allow-Origin *
标头启用CORS, or 跨域资源共享,默认情况下禁用。这会向从您的服务器访问数据的任何 Web 浏览器传达该服务器可能从其他端口或域加载资源的信息。需要 CORS 才能最大程度地兼容HLS 和 DASH 客户端,以及许多其他 Web 部署中的常见配置切换。
Save and close the file. Note that you’re using port 8088
here, which is another arbitrary choice for this tutorial to avoid conflicting with any services you may be running on port 80
or 443
. You’ll want to open that port in your firewall for now too:
最后,创建一个stream
Web 根目录中的目录来匹配配置块,以便 Nginx 可以生成 HLS 和 DASH 所需的文件:
-
sudo mkdir/var/www/html/stream
再次重新加载 Nginx:
You should now have an HLS stream available at http://your_domain:8088/hls/stream.m3u8
and a DASH stream available at http://your_domain:8088/dash/stream.mpd
. These endpoints will generate any necessary metadata on top of your RTMP video feed in order to support modern APIs.
您在本教程中使用的配置选项均记录在Nginx RTMP 维基页面。 Nginx 模块通常共享通用语法并公开大量配置选项,您可以在此处查看其文档以更改任何设置。
几乎所有互联网视频流都是在 RTMP、HLS 和 DASH 之上实现的,通过使用您在本教程中探索的方法,您可以通过其他广播服务提供流,或以您选择的任何其他方式公开它。接下来,您可以阅读有关将 Nginx 配置为反向代理使其中一些不同的视频端点可用作子域。