源碼地址:https://github.com/Tinywan/PHP_Experience
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.9.4”替換“nginx-1.7.5”或者任何最新版本的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; } } }
nginx.conf
如果您查詢您喜歡的搜索引擎“nginx-rtmp指令”,您可以在此文件中找到清晰的說明和變量示例。我已經使用nginx-rtmp與HLS幾年了,而不使用“允許發布”和“拒絕發布”指令,我看到使用/入侵我的視頻服務器的零個例子。所以我沒有在這里列出這些指令。如果您願意,請閱讀並添加這些指令。
更改nginx.conf
文件后,您必須重新啟動Nginx才能使用新的配置:
sudo service nginx restart
仔細觀察任何Nginx錯誤消息,並解決由拼寫錯誤,文件夾所有權或權限問題引起的任何錯誤。如果您沒有錯誤消息,則可以創建編碼流。
您必須擁有一個視頻編碼器才能創建流。我使用OBS(開放廣播軟件) - 這是開源的,對我來說很好。還有其他解決方案可供選擇,這些不在本教程的范圍之內。我不會涵蓋有關配置RTMP視頻編碼器的所有內容。他們都需要大致相同的輸入變量。您需要輸入的關鍵設置才能使用我的精確nginx.conf
配置,並在大多數播放器/瀏覽器/平台上運行良好,具體如下:
- Encoder-x264
- 可變比特率(不是CBR或恆定比特率),質量最高
- 最大比特率 - 600kbps
- 音頻編解碼器AAC
- 音頻格式-44.1khz
- 音頻比特率-64kbps
- FMS URL-“rtmp:// my-ip:1935 / live”
- Stream Key-“my-stream-key”
- 分辨率640x480
- FPS(每秒幀數)-30
- CFR(恆定幀速率) - 是的
- 關鍵幀間隔-2秒(每2秒一個關鍵幀)
- x264編碼配置文件基線(可能與主要配合使用取決於使用的播放器)
- x264 CPU現在非常快
我建議嘗試不同的編碼器和試驗。您可能需要寬闊的比例 - 或者您的相機(或其他廣播)材料可能需要它。如果是這樣,請確保在編碼器中更改此信息以及nginx.conf
我提供的文件的exec-ffmpeg部分中列出的寬高比; 否則你會得到一些愚蠢的視頻Feed。
您的編碼器設置完成后,您可以全部進行測試。啟動編碼器與您的網絡攝像頭或其上運行的某種測試飼料。此時,您可以使用VLC播放器使用以下URL:
http://my-ip/live/my-stream-key/index.m3u8
http://my-ip/mobile/my-stream-key/index.m3u8
這些分別用於您的主要和移動視頻流。相應地替換您的IP和流密鑰。
在您成功播放您的第一個流檢查(通過ssh或ftp)后,您的直播廣播錄制在/video_recordings
Vultr VPS上的文件夾中。您還可以嘗試使用以下URL在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.xml
在您的nginx/html
文件夾中創建一個文件,並在其中放置說明以允許數據在域之間流動:
sudo nano /usr/local/nginx/html/crossdomain.xml
第一個副本(從此頁面),然后粘貼(右鍵單擊)到納米編輯器字段以下XML數據:
<?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文件,然后填入以下內容。
文件1:
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>
文件2
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.m3u8
並http://my-ip/mobile/my-stream-key/index.m3u8
分別使用。您還必須src
在頭jquery-1.11.2.min.js
和頭中添加腳本標記flowplayer.min.js
。標簽被教程軟件剝離。通過查看example html
Flowplayer套件附帶的文件,您可以找到如何打造這些標簽。
啟動編碼器與您的網絡攝像頭或其上運行的某種測試飼料。您可以使用以下網址在瀏覽器中查看廣播:
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流服務器!
一下為測試遇到的問題:
1、虛擬機搭建的RTMP系統推流推流不了
檢查原因,結果是這里多了一個空格(自己復制粘貼的原因)
Nginx 服務器斷掉的情況
2、發現自己的賬戶進入不了生成的m3u8文件夾中,ls 后原來的是nobody
修改nginx.conf 配置文件,重啟Nginx服務器,OBS繼續推流,發型生成了視頻文件(往期回顧視頻)
文檔:https://www.vultr.com/docs/setup-nginx-on-ubuntu-to-stream-live-hls-video