在Ubuntu上设置Nginx以流式传输实时HLS视频

HTTP Live Streaming(HLS)是由Apple Inc.实现的非常强大的流视频协议。HLS使用HTTP事务,该事务穿越防火墙,代理,并且可以轻松地通过CDN分发。因此,与RTP或其他基于UDP的协议相比,该技术能够吸引更多的观众。如今,在线上的许多实时流视频都由使用HLS的昂贵系统托管,但它们通常很昂贵,并且需要大量服务器资源。本教程将向您展示如何设置非常实惠的Ubuntu 14.04 VULTR VPS,以仅使用开源软件来进行HLS实时流事件。

第一步是根据Vultr Doc“ 在Ubuntu 14.04上安装Nginx-RTMP ”读取并设置服务器。在撰写本文时,该文档中的说明对于设置阶段是最全面的。我要提到的是,您可能希望将“ nginx-1.7.5”替换为“ nginx-1.9.4”或任何可用的Nginx最新版本。另一个建议是使用HTTP存根状态模块编译Nginx,以便使自己能够监视以后有多少个实时HLS查看器。

而不是编译:

./configure --with-http_ssl_module  --add-module=../nginx-rtmp-module-master

在必备文档中概述的过程中使用此字符串:

./configure --with-http_ssl_module --with-http_stub_status_module --add-module=../nginx-rtmp-module-master

本教程中的示例将创建“实时”和“移动”(优化)流,并将使用ffmpeg(安装在上一教程中)生成经过比特率调整,针对移动设备优化的HLS流。该示例还将说明如何使服务器自动记录您的实时流,以及如何使您将记录作为视频点播(VOD)回放服务进行回放。

首先,创建保存实时和移动HLS清单和视频片段所需的文件夹结构:

sudo mkdir /HLS
sudo mkdir /HLS/live
sudo mkdir /HLS/mobile
sudo mkdir /video_recordings
sudo chmod -R 777 /video_recordings

如果尚未打开防火墙,则可能是个好主意。如果是这样,则必须允许流量进入Nginx和HLS使用的端口。如果您现在想在没有防火墙的情况下运行,请忽略下面的ufw部分。

sudo ufw limit ssh
sudo ufw allow 80
sudo ufw allow 1935
sudo ufw enable

HLS流传输需要与第一篇文章中的RTMP配置明显不同的Nginx配置。编辑nginx.conf文件以使用以下内容,将“ my-ip”和“ my-stream-key”替换为您的信息。您可以将任何您想使用的东西用作“ my-stream-key”,这只是一个对您有帮助的独特单词。您可能希望先备份原始配置文件,然后将我提供的配置信息粘贴到编辑器中,替换那里的所有内容:

sudo cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.original
sudo nano /usr/local/nginx/conf/nginx.conf

新的nginx.conf:

worker_processes  1;
error_log  logs/error.log debug;
events {
worker_connections  1024;
}
rtmp {
server {
listen 1935;
allow play all;

#creates our "live" full-resolution HLS videostream from our incoming encoder stream and tells where to put the HLS video manifest and video fragments
application live {
allow play all;
live on;
record all;
record_path /video_recordings;
record_unique on;
hls on;
hls_nested on;
hls_path /HLS/live;
hls_fragment 10s;

#creates the downsampled or "trans-rated" mobile video stream as a 400kbps, 480x360 sized video
exec ffmpeg -i rtmp://192.168.254.178:1935/$app/$name -acodec copy -c:v libx264 -preset veryfast -profile:v baseline -vsync cfr -s 480x360 -b:v 400k maxrate 400k -bufsize 400k -threads 0 -r 30 -f flv rtmp://192.168.254.178:1935/mobile/$;
}

#creates our "mobile" lower-resolution HLS videostream from the ffmpeg-created stream and tells where to put the HLS video manifest and video fragments
application mobile {
allow play all;
live on;
hls on;
hls_nested on;
hls_path /HLS/mobile;
hls_fragment 10s;
}

#allows you to play your recordings of your live streams using a URL like "rtmp://my-ip:1935/vod/filename.flv"
application vod {
play /video_recordings;
}
}
}


http {
include       mime.types;
default_type  application/octet-stream;

server {
listen 80;
server_name 192.168.254.178;

#creates the http-location for our full-resolution (desktop) HLS stream - "http://my-ip/live/my-stream-key/index.m3u8"      
location /live {
types {
application/vnd.apple.mpegurl m3u8;
}
alias /HLS/live;
add_header Cache-Control no-cache;
}

#creates the http-location for our mobile-device HLS stream - "http://my-ip/mobile/my-stream-key/index.m3u8"        
location /mobile {
types {
application/vnd.apple.mpegurl m3u8;
}
alias /HLS/mobile;
add_header Cache-Control no-cache;
}   

#allows us to see how stats on viewers on our Nginx site using a URL like: "http://my-ip/stats"     
location /stats {
stub_status;
}

#allows us to host some webpages which can show our videos: "http://my-ip/my-page.html"     
location / {
root   html;
index  index.html index.htm;
}   
}
}

Ctrl + X退出。说“是”以保存更改。

nginx.conf如果您在自己喜欢的搜索引擎中查询“ nginx-rtmp指令” ,则可以在此文件中找到清晰的指令和变量示例。多年来,我一直在HLS中使用nginx-rtmp,而未使用“ allow publish”和“ deny publish”指令,并且已经看到零个实例使用/入侵我的视频服务器。因此,我没有在此处包括这些指令。阅读并根据需要添加这些指令。

更改nginx.conf文件后,必须重新启动Nginx才能使用新配置:

sudo service nginx restart

仔细观察是否有Nginx错误消息,并解决由拼写错误,文件夹所有权或权限问题引起的任何错误。如果没有错误消息,则准备创建编码流。

您必须具有视频编码器才能创建流。我使用OBS(开放广播软件)-这是开源的,对我来说效果很好。还有其他解决方案可供选择,这些解决方案不在本教程的讨论范围之内。我不会介绍有关配置RTMP视频编码器的所有内容。它们都需要大致相同的输入变量。要使用我的确切nginx.conf配置并在大多数播放器/浏览器/平台上正常运行,您需要输入以下关键设置:

  1. 编码器-x264
  2. 可变比特率(不是CBR或恒定比特率),质量最高
  3. 最大比特率-600kbps
  4. 音频编解码器AAC
  5. 音频格式44.1khz
  6. 音频比特率64kbps
  7. FMS URL-“ rtmp:// my-ip:1935 / live”
  8. 流键-“我的流键”
  9. 分辨率-640x480
  10. FPS(每秒帧数)-30
  11. CFR(恒定帧频)-是
  12. 关键帧间隔2秒(每2秒一个关键帧)
  13. x264编码配置文件基准(可能与main一起使用-取决于使用的播放器)
  14. x264 CPU-非常快

我建议尝试使用不同的编码器并进行试验。您可能需要宽高比-或您的相机(或其他广播)材料可能需要它。如果是这样,请确保更改编码器中的此信息以及nginx.conf我提供的文件的exec-ffmpeg部分中列出的宽高比;否则,您将获得一些看起来很愚蠢的视频供稿。

编码器设置完成后,就可以进行全部测试。使用网络摄像头或在其上运行的某种测试推杆启动编码器。此时,您可以使用VLC播放器使用以下网址查看您的广播:

http://my-ip/live/my-stream-key/index.m3u8
http://my-ip/mobile/my-stream-key/index.m3u8

这些分别用于您的主要和移动视频流。分别替换您的IP和流密钥。

成功广播/video_recordings完第一个流检查(通过ssh或ftp)后,您的实时广播已记录在Vultr VPS 的文件夹中。您也可以尝试使用以下网址在VLC中播放此录制的文件:

rtmp://my-ip/vod/filename.flv

Nginx统计信息也可用(带有Nginx stub_status)。要查看访问者/查看者的统计信息,请访问:

http://my-ip/stats

���了在网页上观看视频,您需要一个可嵌入的播放器。有许多可嵌入的播放器可以播放HLS视频。我已经使用JW Player几年了,但是免费版本将无法播放HLS。Bitmovin的Flowplayer和Bitdash(包括其他解决方案)足够慷慨地免费提供其播放器的非商业版本,这将使您的HLS流嵌入到网页中。在本文中,我对它们都进行了尝试,发现它们都可以与基于Vultr / Nginx的视频服务器一起很好地工作。我将简要展示如何让Flowplayer与我的测试台机器一起使用。

如果您打算以任何常规,持续或商业方式使用实时HLS流,我建议您从Flowplayer或决定使用的任何播放器购买许可证。您将获得一个播放器,它具有更少的限制,更多的功能,并且可以被烙印到您的组织中。您还将获得支持-这可能非常重要。除了Vultr VPS,这实际上是与项目相关的唯一成本。

在执行其他任何操作之前,请务必注意所谓的“跨域”限制,否则这些限制将关闭您流式传输到网页/网站的能力。crossdomain.xmlnginx/html文件夹中创建一个文件,并在其中放置说明,以允许数据在域之间流动:

sudo nano /usr/local/nginx/html/crossdomain.xml

首先复制(从此页面),然后将以下XML数据粘贴(右键单击)到nano编辑器字段中:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>

Ctrl + O进行写出,然后按Ctrl + X将文件保存到磁盘并退出。

我抓取了Flowplayer的HTML5(版本6.0.3),解压缩后给了我许多文件和文件夹。我将所有文件和文件夹上载到了名为“ flowplayer”的Nginx / HTML根文件夹的子文件夹中。确切的路径是/usr/local/nginx/html/flowplayer

为了在嵌入网页时测试我们的视频,请使用nano在Nginx / HTML文件夹的根目录中创建几个HTML文件,并在其中填充以下内容。

文件:

sudo nano /usr/local/nginx/html/hls.html

HTML代码:

<!doctype html>
<head>
<link rel="stylesheet" href="#">
</head>

<body>
640x480 664kbps (live) Desktop Browsers<br>
<div style="width:640px;" class="flowplayer" data-swf="flowplayer/flowplayer.swf" data-ratio="0.75">
<video>
<source type="application/x-mpegurl" src="">
</video>
</div>
<br><br>
480x360 464kbps (mobile) Mobile Browsers <br>
<div style="width:480px;" class="flowplayer" data-swf="flowplayer/flowplayer.swf" data-ratio="0.75">
<video>
<source type="application/x-mpegurl" src="">
</video>
</div>
</body>

文件:

sudo nano /usr/local/nginx/html/hls_progressive.html

HTML代码:

<!doctype html>
<head>
<link rel="stylesheet" href="#">
<style> .flowplayer { width: 640px; } </style>
</head>

<body>
<div class="flowplayer" data-swf="flowplayer/flowplayer.swf" data-ratio="0.75">
<video>
<source type="application/x-mpegurl" src=""> 
<source type="application/x-mpegurl" src="">
</video>
</div>
<br>
</body>

确保用您的数据替换“ my-ip”和“ my-stream-key”。

您必须flowplayer/skin/functional.css在样式表中用路径替换“#”符号href="#"。教程软件将清除路径。您必须在该src=""部分中填写一个URL- 教程软件分别将其剥离,使用http://my-ip/live/my-stream-key/index.m3u8http://my-ip/mobile/my-stream-key/index.m3u8。您还必须添加脚本src的头部标签都jquery-1.11.2.min.jsflowplayer.min.js。标签已被教程软件剥离。您可以通过查看example htmlFlowplayer套件随附的文件找到如何设置这些标签的样式。

使用网络摄像头或在其上运行的某种测试推杆启动编码器。您可以使用以下URL在浏览器中查看广播:

http://my-ip/hls.html
http://my-ip/hls_progressive.html

第一页仅显示您的每个流-主流和移动平台。您将能够启动它们并查看它们。您会注意到,移动平台流的大小较小。这些步骤只是为了确保一切都在运行。

第二页显示单个流。但这是以所谓的“渐进式流”进行设置的。这意味着当观看者播放视频时,如果观看者的连接可以维持视频流,则服务器和播放器都将尝试向观看者提供高比特率,高质量的流。如果它们的连接不良并且无法维持连接,则会向下滚动以显示带宽降低200 kbps的较低比特率(移动)流。如果您愿意,可以使用ffmpeg创建更多的渐进式渐进流,并使用我的示例进行配置。

我已经在单核1GB Vultr VPS上测试了此配置,发现使用单个实时流以及使用ffmpeg创建的转换后的移动流,cpu使用率不到35%,并且仅消耗了100MB我的1GB RAM。现在,这是一个非常有效的设置。

如果计划流传输的像素尺寸比SD大得多的视频,则可能会发现您必须使用功能更强大的VPS。我对此感到很好奇,并把主流运行到1280x960像素和2Mbps,这给事情增加了负担。但是VPS仍仅使用50%的CPU,内存使用量仍为100MB。我添加了十几个查看器/浏览器,这对VPS的负载几乎没有影响-仅增加了使用的带宽。我敢肯定,使用ffmpeg创建其他转换速率的流将继续给系统带来额外的负担。

我已经在具有50至100个并发用户的生产环境中使用这种类型的服务器,并且发现资源使用率随着查看器连接的增加而增加很少。尝试一下。但我认为,大多数用户会喜欢使用单核1GB VPS。享受您的新HLS流服务器!



如何在CentOS 7上安装Oxwall

如何在CentOS 7上安装Oxwall

Oxwall是一个开源社交网络软件平台,可用于免费构建自定义社交网站(SNS)。在这篇文章中,

在Ubuntu上安装Spigot

在Ubuntu上安装Spigot

Spigot是对Minecraft服务器软件CraftBukkit的修改。Spigot优化了服务器资源的使用,确保您的播放器获得最佳体验

如何在Debian 9 LAMP VPS上安装October 1.0 CMS

如何在Debian 9 LAMP VPS上安装October 1.0 CMS

使用其他系统?October 1.0 CMS是基于Laravel框架构建的简单,可靠,免费和开源的内容管理系统(CMS)

如何在Debian 9上安装Monica

如何在Debian 9上安装Monica

使用其他系统?Monica是一个开源的个人关系管理系统。可以将其视为CRM(销售团队使用的一种流行工具

如何在Fedora 26 LAMP VPS上安装MODX Revolution

如何在Fedora 26 LAMP VPS上安装MODX Revolution

使用其他系统?MODX Revolution是一种快速,灵活,可扩展,免费和开源的企业级内容管理系统(CMS),由

在Fedora 28上安装Anchor CMS

在Fedora 28上安装Anchor CMS

使用其他系统?Anchor是用PHP编写的轻量级开源博客CMS。Anchors源代码托管在GitHub上。本指南将向您展示

如何在Ubuntu 16.04上安装Taiga项目管理工具

如何在Ubuntu 16.04上安装Taiga项目管理工具

使用其他系统?Taiga是用于项目管理的免费和开源应用程序。与其他项目管理工具不同,Taiga使用增量

在Ubuntu上配置Nagios:第1部分-Nagios服务器

在Ubuntu上配置Nagios:第1部分-Nagios服务器

本文是有关在Ubuntu 14.04上安装和配置Nagios的2部分系列文章的一部分。第1部分:Nagios服务器第2部分:远程主机概述Nagio

如何在Debian 9上安装Grav CMS

如何在Debian 9上安装Grav CMS

使用其他系统?Grav是用PHP编写的开源平面文件CMS。Grav源代码公开托管在GitHub上。本指南将向您展示如何

如何在Fedora 26 LAMP VPS上安装Pagekit 1.0 CMS

如何在Fedora 26 LAMP VPS上安装Pagekit 1.0 CMS

使用其他系统?Pagekit 1.0 CMS是一个美观,模块化,可扩展,轻量级,免费和开源的内容管理系统(CMS),具有

如何在Ubuntu 16.04 LAMP VPS上安装BigTree CMS

如何在Ubuntu 16.04 LAMP VPS上安装BigTree CMS

使用其他系统?BigTree CMS 4.2是一种快速,轻量级,免费和开源的企业级内容管理系统(CMS),具有广泛的功能。

如何在CentOS 7上设置vsFTPd

如何在CentOS 7上设置vsFTPd

FTP是用于通过Internet传输文件的有用协议,本指南将向您展示如何设置vsFTPd(非常安全的文件传输协议守护程序)o

如何在Ubuntu 16.04上安装GitBucket

如何在Ubuntu 16.04上安装GitBucket

本指南涵盖了针对运行Ubuntu 16.04的Vultr实例的GitBucket的基本安装和设置,并假定您正在以以下方式执行命令:

如何在Fedora 29上安装Attendize

如何在Fedora 29上安装Attendize

使用其他系统?简介Attendize是一个基于Laravel PHP框架的开源门票销售和事件管理平台。Attendiz

如何在CentOS 7上安装BoltWire CMS

如何在CentOS 7上安装BoltWire CMS

使用其他系统?简介BoltWire是一个用PHP编写的免费,轻量级的内容管理系统。与大多数其他内容管理人员相比

如何在Ubuntu 16.04 LAMP VPS上安装Selfoss RSS Reader

如何在Ubuntu 16.04 LAMP VPS上安装Selfoss RSS Reader

使用其他系统?Selfoss RSS Reader是一种免费的开源自托管基于Web的多功能实时流,mashup,新闻提要(RSS / Atom)阅读器

如何在Ubuntu 16.04 LAMP VPS上安装Paste 2.1

如何在Ubuntu 16.04 LAMP VPS上安装Paste 2.1

使用其他系统?Paste 2.1是一个简单,灵活,免费和开源的pastebin应用程序,用于存储代码,文本等。最初是

如何在Ubuntu 16.04上安装Dolibarr

如何在Ubuntu 16.04上安装Dolibarr

使用其他系统?Dolibarr是面向企业的开源企业资源计划(ERP)和客户关系管理(CRM)。多利巴尔

如何在CentOS 7上安装Microweber

如何在CentOS 7上安装Microweber

使用其他系统?Microweber是一个开放源代码的拖放式CMS和在线商店。Microweber源代码托管在GitHub上。本指南将向您展示

AI 能否應對越來越多的勒索軟件攻擊?

AI 能否應對越來越多的勒索軟件攻擊?

勒索軟件攻擊呈上升趨勢,但人工智能能否幫助應對最新的計算機病毒?AI 是答案嗎?在這裡閱讀知道是 AI 布恩還是禍根

ReactOS:這是 Windows 的未來嗎?

ReactOS:這是 Windows 的未來嗎?

ReactOS,一個開源和免費的操作系統,這裡有最新版本。它能否滿足現代 Windows 用戶的需求並打倒微軟?讓我們更多地了解這種老式但更新的操作系統體驗。

通過 WhatsApp 桌面應用程序 24*7 保持聯繫

通過 WhatsApp 桌面應用程序 24*7 保持聯繫

Whatsapp 終於為 Mac 和 Windows 用戶推出了桌面應用程序。現在您可以輕鬆地從 Windows 或 Mac 訪問 Whatsapp。適用於 Windows 8+ 和 Mac OS 10.9+

人工智能如何將流程自動化提升到新的水平?

人工智能如何將流程自動化提升到新的水平?

閱讀本文以了解人工智能如何在小型公司中變得流行,以及它如何增加使它們成長並為競爭對手提供優勢的可能性。

macOS Catalina 10.15.4 補充更新引發的問題多於解決

macOS Catalina 10.15.4 補充更新引發的問題多於解決

最近,Apple 發布了 macOS Catalina 10.15.4 補充更新以修復問題,但似乎該更新引起了更多問題,導致 mac 機器變磚。閱讀這篇文章以了解更多信息

大數據的13個商業數據提取工具

大數據的13個商業數據提取工具

大數據的13個商業數據提取工具

什麼是日誌文件系統,它是如何工作的?

什麼是日誌文件系統,它是如何工作的?

我們的計算機以稱為日誌文件系統的有組織的方式存儲所有數據。這是一種有效的方法,可以讓計算機在您點擊搜索時立即搜索和顯示文件。 https://wethegeek.com/?p=94116&preview=true

技術奇點:人類文明的遙遠未來?

技術奇點:人類文明的遙遠未來?

隨著科學的快速發展,接管了我們的大量工作,我們陷入無法解釋的奇點的風險也在增加。閱讀,奇點對我們意味著什麼。

洞察 26 種大數據分析技術:第 1 部分

洞察 26 種大數據分析技術:第 1 部分

洞察 26 種大數據分析技術:第 1 部分

2021 年人工智能對醫療保健的影響

2021 年人工智能對醫療保健的影響

過去幾十年,醫療保健領域的人工智能取得了巨大飛躍。因此,醫療保健中人工智能的未來仍在日益增長。