送走了共享經濟,迎來了直播浪潮。做爲一個開發者,總想去探索本身的未知領域。我今天將手把手教你搭建一個SRS直播流服務和一個Node.js服務。Node.js服務向SRS直播流服務請求視頻數據,而後解析請求後的數據,最後將解析後的數據推送給html頁面video標籤。html
本文將圍繞如下幾方面展開:node
雲市場上的服務有不少選擇,諸如國內某某雲、國外某某雲。這裏爲了避嫌,這裏就不作推薦。注意本篇文章講述的示例都是在ubuntu系統環境中,所以推薦雲主機安裝ubuntu系統。python
下面是不一樣的終端鏈接雲服務的工具:linux
使用 Windows 系統的電腦 一、下載安裝 Windows SSH 和 Telnet 客戶端工具 Putty。下載Putty 二、用戶名:root,Host:193.112.195.120 三、按照 Putty 使用幫助進行登陸。Putty 密碼方式使用幫助nginx
使用 Linux/Mac OS X 系統的電腦(使用密碼登陸) 一、打開 SSH 客戶端(Mac可以使用系統自帶的終端) 二、輸入ssh -q -l root -p 22 193.112.195.120 三、輸入 CVM 實例密碼進行登陸。git
使用 Linux/Mac OS X 系統的電腦(使用密鑰登陸) 一、打開 SSH 客戶端(Mac可以使用系統自帶的終端)。 二、查找您雲服務器關聯的 SSH 密鑰文件本地存放地址。 三、您的密鑰必須不公開可見,SSH 才能工做。請使用此命令:chmod 400 [密鑰文件路徑]。 四、輸入命令:ssh [-i 密鑰文件路徑] root@193.112.195.120。github
wget命令用來從指定的URL下載文件,命令可參照wget命令大全。chrome
安裝wget工具命令:express
sudo apt-get update
sudo apt-get install wget
複製代碼
檢查wget是否安裝成功: npm
在Ubuntu系統下安裝Node.js環境的方式有不少,可參照在Ubuntu下安裝Node.JS的不一樣方式。本文將採用源碼的方式:
sudo apt-get update
sudo apt-get install python gcc make g++
複製代碼
sudo wget http://nodejs.org/dist/v8.11.1/node-v8.11.1.tar.gz
sudo tar zxvf node-v8.11.1.tar.gz
複製代碼
cd node-v8.11.1
sudo ./configure
sudo make install
複製代碼
檢查Node.js的安裝版本: node -v
安裝nginx前須要安裝pcre
sudo wget https://ftp.pcre.org/pub/pcre/pcre2-10.31.tar.gz
sudo tar zxvf pcre2-10.31.tar.gz
複製代碼
配置
cd pcre2-10.31
sudo ./configure
複製代碼
編譯
sudo make
複製代碼
安裝
sudo make install
複製代碼
安裝nginx前須要安裝zlib
sudo apt-get install zlib1g-dev
複製代碼
安裝nginx的方法有不少,能夠參照Ubuntu中Nginx的安裝與配置。
這裏我將採用源碼安裝方式,安裝nginx。
下載nginx源碼並解壓 sudo wget http://nginx.org/download/nginx-1.12.2.tar.gz sudo tar zxvf nginx-1.12.2.tar.gz
配置
sudo ./comfigure
複製代碼
編譯 sudo make
安裝
sudo make install
**注意:**有時還須要安裝一些nginx包
執行以下命令安裝nginx包
sudo apt-get install nginx-core
sudo apt-get install nginx-extras
sudo apt-get install nginx-full
sudo apt-get install nginx-light
複製代碼
配置nginx nginx.conf文件一般在文件夾/etc/nginx/nginx.conf中,經過vi命令編輯。vi常見命令
這裏介紹下幾個最多見的vi命令:
打開文件 sudo vi xxxx
鍵入文件編輯模式 打開文件後,按i鍵(文件底部出現insert)
切換文件模式 在上一步的基礎上按esc鍵(文件底部的insert消失)
退出文件 在上一步的基礎上按「:」+「 q 」 +「!」組合鍵後不保存並退出 在上一步的基礎上按「:」+「 w 」 +「q」組合鍵後保存並退出
啓動nginx服務 nginx啓動端口默認是80
啓動前能夠先肯定下端口的佔用狀況: sudo lsof -i:80
若是端口被佔用,可使用kill命令殺死進程。
nginx的啓動文件通常在/usr/local/nginx/sbin文件夾中,常見nginx服務命令有:
sudo nginx //啓動服務
sudo nginx -s stop //關閉服務
sudo nginx -s reload //重啓服務
sudo nginx -t -c /usr/local/nginx/conf/nginx.conf //檢查nginx配置是否正確
複製代碼
SRS定位是運營級的互聯網直播服務器集羣,追求更好的概念完整性和最簡單實現的代碼。SRS提供不少種視頻流服務,詳細可見SRS的github文檔。
常見直播協議:
我這裏選擇的是http-flv協議,由於我解析SRS視頻流的框架選擇的是Bibili的flv框架,詳見下一節。http-flv流服務部署流程參見SRS-HTTP-FLV部署實例:
git clone https://github.com/ossrs/srs && cd srs/trunk
sudo ./configure && make
sudo make
sudo ./objs/srs -c conf/http.flv.live.conf
OBS軟件免費,開源軟件,用於實時流媒體直播和錄製。 至於OBS的使用詳細參見鬥魚OBS使用教程。
須要在OBS配置流的路徑:rtmp://你的ip地址/live,以及流的名稱。
驗證flv流是否推送成功 在瀏覽器中輸入:http://118.89.247.129:8080/live/live.flv,若是出現下載的視頻,則說明OBS成功的向SRS服務推送流服務。
flv.js是來自Bilibli的開源項目。它解析FLV文件餵給原生HTML5 Video標籤播放音視頻數據,使瀏覽器在不借助Flash的狀況下播放FLV成爲可能。詳細參見使用flv.js作直播。
我在github上開源了本身使用flv.js庫實現直播的代碼。代碼是使用node.js的express框架搭建的服務,若是想要將代碼在ubuntu服務器上運行,須要開發者具有一點node.js的知識。
git clone https://github.com/spursy/live.git // 克隆node.js代碼
cd live // 進入項目
npm install // 安裝項目必須的包
npm run dev // 啓動項目
複製代碼
注意在啓動項目前須要修改live/view/index.html中的視頻源路徑
if (flvjs.isSupported()) {
var flvPlayer = flvjs.createPlayer({
type: 'flv',
"isLive": true,//<====加個這個
url: "http://bianchenggou.wang:8080/live/live.flv',//<==自行修改 //url:"demo.flv" }); flvPlayer.attachMediaElement(videoElement); flvPlayer.load(); //加載 flv_start(); } 複製代碼
當程序啓動node.js服務後訪問http://193.112.195.120:9000/,並不能接收到視屏流,經過chrome瀏覽器的F12快捷鍵查看異常:
控制檯的異常顯示是不能容許跨域請求,解決不容許跨域請求的方式有不少,參見一篇文章能夠解決跨域。
我這裏使用的是在服務器的nginx配置裏設置容許跨域訪問,詳見nginx跨域配置。
在安裝nginx時,nginx.conf文件放在文件夾**/usr/local/nginx/conf**中。nginx的配置文件的使用能夠參見Nginx教程。
修改以下:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
##
# Access-Control
##
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
server {
listen 80;
server_name bianchenggou.wang;
location /srs/ {
proxy_pass http://127.0.0.1:8080/;
}
location / {
proxy_pass http://127.0.0.1:9000/;
}
}
}
複製代碼
因爲nginx對全部的請求都作了代理服務,所以live/view/index.html中的視頻源路徑應修改成:
if (flvjs.isSupported()) {
var flvPlayer = flvjs.createPlayer({
type: 'flv',
"isLive": true,//<====加個這個
url: "http://bianchenggou.wang/srs/live/live.flv',//<==自行修改 //url:"demo.flv" }); flvPlayer.attachMediaElement(videoElement); flvPlayer.load(); //加載 flv_start(); } 複製代碼
當再次訪問node服務時,就不會再出現異常。
OBS直播軟件的配置不變,按照教程推送直播流後,啓動node.js服務,進去直播頁面: