Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
ginx 是一個(gè)高性能的 Web 服務(wù)器和反向代理服務(wù)器,它也可以作為視頻直播流媒體服務(wù)器使用。下面是如何利用 Nginx 實(shí)現(xiàn)視頻直播推流和拉流的方式,以及其中所涉及到的模塊和工具:
首先需要在服務(wù)器上安裝 Nginx,可以根據(jù)操作系統(tǒng)的不同,采取相應(yīng)的包管理器安裝,例如在 Ubuntu 下可以執(zhí)行以下命令進(jìn)行安裝:
復(fù)制代碼sudo apt-get update
sudo apt-get install nginx
在開始配置之前,需要安裝幾個(gè) Nginx 相關(guān)的模塊,其中最常用的是 RTMP 模塊,其實(shí)現(xiàn)了基于 RTMP 協(xié)議的視頻直播功能。可以通過以下命令下載和安裝 RTMP 模塊:
復(fù)制代碼cd /usr/src/
sudo git clone https://github.com/arut/nginx-rtmp-module.git
另外,為了提供 HTTPS 支持,還需要安裝 SSL 模塊:
復(fù)制代碼sudo apt-get install libssl-dev
sudo apt-get install openssl
在配置 Nginx 前,需要知道本地服務(wù)的 IP 地址。在Ubuntu 中,可以使用 ifconfig 命令來查看 IP 地址。
打開 Nginx 的默認(rèn)配置文件 /etc/nginx/nginx.conf,在頭部添加如下代碼:
復(fù)制代碼rtmp {
server {
listen 1935;
chunk_size 4000;
application live {
live on;
record off;
}
}
}
其中,listen 指定監(jiān)聽的端口號,RTMP 握手協(xié)議的端口為 1935;chunk_size 是數(shù)據(jù)包分段的大小(單位是字節(jié))。
接下來要在 http 部分添加以下代碼:
復(fù)制代碼http {
...
server {
listen 80;
server_name localhost;
location /rtmp_stat {
rtmp_stat all; # enable the status module
rtmp_stat_stylesheet stat.xsl; # path to the stylesheet
}
location /rtmp_stat.xsl {
root /usr/src/nginx-rtmp-module/;
}
location / {
proxy_pass http://127.0.0.1:8080;
#root /usr/share/nginx/html;
index index.html index.htm;
}
location /live {
flv_live on;
add_header 'Cache-Control' 'no-cache';
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
add_header 'Access-Control-Allow-Headers' 'Range';
chunked_transfer_encoding on;
types {
video/mp4 mp4;
video/x-flv flv;
}
root /usr/local/webrtc_files;
autoindex on;
}
}
}
這里添加了一個(gè) HTTP 塊,用于提供統(tǒng)計(jì)信息功能。具體就是通過 /rtmp_stat 和 /rtmp_stat.xsl 節(jié)點(diǎn)來訪問 RTMP 狀態(tài)頁,可以實(shí)時(shí)獲取到當(dāng)前連接和流狀態(tài)信息。
/live 節(jié)點(diǎn)是用來開啟一個(gè) HTTP Flv 轉(zhuǎn)發(fā)服務(wù),提供對 RTMP 直播視頻的訪問支持。其中 add_header 'Cache-Control' 'no-cache'; 表示不緩存返回內(nèi)容,add_header 'Access-Control-Allow-Origin' '*' always; 設(shè)置了允許跨域請求,并添加了幾個(gè) Access-Control 標(biāo)頭。
在修改完配置文件后,使用 sudo nginx -t 檢查是否有配置錯誤。如果沒有報(bào)錯,則可以通過以下命令啟動 Nginx 服務(wù)器:
復(fù)制代碼sudo service nginx start
現(xiàn)在已經(jīng)可以通過 RTMP 協(xié)議發(fā)送和接收視頻直播流。
在推流前,需要先安裝推流工具,例如 OBS(https://obsproject.com/download)或 FFmpeg(https://ffmpeg.org/download.html)等。
使用 OBS 進(jìn)行推流時(shí),將 RTMP URL 和推流密鑰輸入至設(shè)置中并進(jìn)行測試即可:
復(fù)制代碼rtmp://<server address>:1935/live/<stream_key>
上述命令中的 <server address> 是服務(wù)器的 IP 地址或者域名,<stream_key> 是視頻流名稱或推流密鑰。
在 Web 頁面中,可以通過 video 標(biāo)簽進(jìn)行拉流展示,首先需引入以下 JavaScript 庫:
html復(fù)制代碼<script src="//cdn.bootcss.com/hls.js/0.9.1/hls.min.js"></script>
然后使用以下代碼添加 source 標(biāo)簽和 video 標(biāo)簽:
html復(fù)制代碼<video id="my-video" class="video-js" controls preload="auto" width="640" height="264"
data-setup="{}">
<source src="http://<server address>/live/<stream_key>.flv" type="video/flv">
</video>
其中 <server address> 是您的服務(wù)地址,<stream_key> 指的是您推出的視頻流名稱或推流密鑰。
這樣,就能夠成功在 Web 端看到直播視頻流了。
總之,Nginx 作為一款功能強(qiáng)大的反向代理服務(wù)器,可以通過整合 RTMP、SSL 等模塊輕松實(shí)現(xiàn)視頻直播推流和拉流等重要功能,方便開發(fā)者快速搭建直播系統(tǒng)。這些技術(shù)的應(yīng)用也為直播領(lǐng)域提供了更加全面和豐富的解決方案。
流只能用rtmp協(xié)議,拉流可以使用rtmp協(xié)議和hls協(xié)議。rtmp協(xié)議是adobe公司開發(fā)的開放協(xié)議,hls是蘋果公司推出的直播協(xié)議。我們使用nginx的rtmp插件來搭建推流服務(wù)器
rtmp {
server {
listen 9999;
?
application myapp {
live on;
}
application live {
live on; #開啟實(shí)時(shí)
hls on; #開啟hls
hls_path /usr/local/etc/nginx/html/multimedia/hls; #hls的ts切片存放路徑
hls_fragment 2s; #本地切片長度
hls_playlist_length 6s; #HLS播放列表長度
}
}
}
使用rtmp協(xié)議并且監(jiān)聽了9999端口,如果我們的推流地址填寫的是rtmp://ip:9999/myapp,那么就是純粹的rmtp協(xié)議的流,如果推流地址填寫的是rmtp://ip:9999/live,那么推流之后會在/usr/local/etc/nginx/html/multimedia/hls目錄下生成很多ts格式的視頻切片和一個(gè)m3u8格式的文件,我們想要用http協(xié)議訪問這個(gè)m3u8文件就需要再配置http模塊。
location /live {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias /usr/local/etc/nginx/html/multimedia/hls/;
add_header Cache-Control no-cache;
}
當(dāng)我們的推流地址填寫的是rtmp://ip:9999/live/room1時(shí),使用http://ip:80/live/room1.m3u8就能把rtmp轉(zhuǎn)成hls訪問這個(gè)直播流了。
以上就完成了直播服務(wù)器的搭建。
m3u8格式的直播流
使用obs推流,推流地址可以填寫rtmp://ip:9999/myapp或者rtmp://ip:9999/live,如果用的是rtmp://ip:9999/myapp,在h5端播放的時(shí)候會涉及到h5播放rtmp協(xié)議的問題,h5安裝vide.js之后還要額外安裝videojs-flash插件。
video.js版本是7.8.3
安裝好之后在相關(guān)頁面引入:
import videojs from 'video.js';
import "videojs-flash"
import 'video.js/dist/video-js.css'
然后初始化videojs即可:
player=videojs("myVideo", {
poster: baseUrl + '/file/download?file_id='+that.props.videos.foreImg,
controls: true,
preload: 'auto',
// fluid:false,
fill: true,
playsinline: true,
languages: 'en',
suppressNotSupportedError: false,
sources: that.props.videos.url,
techOrder: ['flash', 'html5']
})
在pc端播放rtmp時(shí)依賴flash播放器,所以要打開flash,這樣就解決了pc端rtmp協(xié)議直播流的問題。
但問題是現(xiàn)在流行的是移動端直播,而蘋果就沒支持過flash播放器,所以目前正常方法解決不了在移動端使用rtmp協(xié)議拉流的問題。
因?yàn)樘O果不支持flash所以使用rtmp拉流肯定是不行的,但是可能客戶給我們的就只有rtmp協(xié)議,那么我們就可以用到上面的另外一個(gè)地址,把rtmp協(xié)議轉(zhuǎn)成hls協(xié)議。
ffmpeg -re -i rtmp://ip:9999/myapp/room1
-vcodec libx264 -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://ip:9999/live/room1
這樣當(dāng)客戶給的拉流地址是rtmp://ip:9999/myapp/room1時(shí),可以用ffmpeg 轉(zhuǎn)成http://ip:9999/live/room1.m3u8實(shí)現(xiàn)全平臺播放了。
但是這樣還有個(gè)問題,因?yàn)榭蛻艚o地址的話,用戶拉流是從客戶平臺上拉,但是如果使用自己的服務(wù)器轉(zhuǎn)了一下的話,那就變成用戶從我們自己的服務(wù)器拉流了,如果用戶比較多的話那帶寬的問題就要考慮一下了。
頻直播是借助流媒體及通信技術(shù),通過采集、編碼、發(fā)布和播放等過程實(shí)現(xiàn)實(shí)時(shí)播放。近年來,隨著移動互聯(lián)網(wǎng)的發(fā)展,企業(yè)的移動端應(yīng)用日漸增長,手機(jī)直播需求也應(yīng)運(yùn)而生。根據(jù)業(yè)務(wù)需求,需在App端和H5端調(diào)用攝像頭視頻流,來達(dá)到現(xiàn)場生產(chǎn)作業(yè)直播的目的。
我廠安裝的攝像頭,主要由海康威視、大華和英飛拓三個(gè)品牌構(gòu)成,輸出協(xié)議均為RTSP。App端支持直接播放RTSP協(xié)議的視頻流,但無法直接在H5端顯示。故欲達(dá)到在H5端直播的目的,需要將RTSP協(xié)議轉(zhuǎn)換成RTMP或HLS協(xié)議。
常見流媒體協(xié)議:
1、RTSP協(xié)議:英文全稱 Real Time Streaming Protocol,RFC2326,實(shí)時(shí)流傳輸協(xié)議,是TCP/IP協(xié)議體系中的一個(gè)應(yīng)用層協(xié)議!協(xié)議主要規(guī)定定了一對多應(yīng)用程序如何有效地通過IP網(wǎng)絡(luò)傳送多媒體數(shù)據(jù)。RTSP體系結(jié)位于RTP和RTCP之上(RTCP用于控制傳輸,RTP用于數(shù)據(jù)傳輸),使用TCP或UDP完成數(shù)據(jù)傳輸!
2、RTMP協(xié)議:RTMP協(xié)議是Real Time Message Protocol(實(shí)時(shí)信息傳輸協(xié)議)的縮寫,它是由Adobe公司提出的一種應(yīng)用層的協(xié)議,用來解決多媒體數(shù)據(jù)傳輸流的多路復(fù)用(Multiplexing)和分包(packetizing)的問題。
3、HLS協(xié)議:HTTP Live Streaming,是Apple的開放標(biāo)準(zhǔn),基于HTTP流,它最初是蘋果公司針對蘋果移動設(shè)備而開發(fā)的流,由于是基于HTTP的,因此很多HTTP的優(yōu)點(diǎn)都得到了繼承。
RTMP協(xié)議支持在Html播放,但是它依賴flash播放器,所以在移動端H5不能采用RTMP協(xié)議。HLS協(xié)議基于HTTP流,支持IOS、Android、HTML5,故采取將RTSP拉流并轉(zhuǎn)碼為HLS協(xié)議輸出的方式,下圖是HLS的工作原理:
2 架構(gòu)設(shè)計(jì)
考慮到內(nèi)網(wǎng)帶寬限制及多用戶并發(fā)以及便于管理,我們采用流媒體服務(wù)器(內(nèi)外網(wǎng)映射、拉流/轉(zhuǎn)碼)+web服務(wù)器+手機(jī)App+H5的方案,其中流媒體服務(wù)器負(fù)責(zé)拉取攝像頭RTSP視頻流,并壓縮編碼成HLS,等待來自手機(jī)App+H5的request請求;WEB服務(wù)器用于管理攝像頭信息;H5端通過video.js開源插件實(shí)現(xiàn)播放,架構(gòu)圖如下:
3 具體實(shí)現(xiàn)
為了保證系統(tǒng)穩(wěn)定性及管理便捷性,我們使用了EasyNVR流媒體服務(wù)器軟件,EasyNVR集成了可視化web管理服務(wù),能夠通過簡單的網(wǎng)絡(luò)攝像機(jī)通道配置,將傳統(tǒng)監(jiān)控行業(yè)里面的高清網(wǎng)絡(luò)攝像機(jī)IP Camera、NVR等具有RTSP協(xié)議輸出的設(shè)備接入到EasyNVR,EasyNVR能夠?qū)⑦@些視頻源的音視頻數(shù)據(jù)進(jìn)行拉取,轉(zhuǎn)換為RTMP或HLS,進(jìn)行全平臺終端H5直播(Web、Android、iOS)
相關(guān)學(xué)習(xí)資料推薦,點(diǎn)擊下方鏈接免費(fèi)報(bào)名,先碼住不迷路~】
音視頻免費(fèi)學(xué)習(xí)地址:https://xxetb.xet.tech/s/2cGd0
【免費(fèi)分享】音視頻學(xué)習(xí)資料包、大廠面試題、技術(shù)視頻和學(xué)習(xí)路線圖,資料包括(C/C++,Linux,F(xiàn)Fmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以點(diǎn)擊788280672加群免費(fèi)領(lǐng)取~
1、安裝流媒體服務(wù)器軟件EasyNVR
在EasyNVR官網(wǎng)下載安裝包,解壓后運(yùn)行ServiceInstall-EasyNVR.exe進(jìn)行安裝,成功將啟動web管理界面。
我們以海康威視攝像頭為例,首先在攝像頭機(jī)web管理界面(默認(rèn)入口是攝像頭ip地址),在網(wǎng)絡(luò)菜單配置里了,開通UPnP端口,以及RTSP視頻流的映射。
開通映射以后,UPnP狀態(tài)顯示生效。
根據(jù)海康威視攝像頭的視頻流格式,拼出該攝像頭的RTSP地址,如:rtsp://賬號:密碼@http://172.16.xxx.xxx:554/h264/ch35/main/av_stream
可使用VLC media player軟件對攝像頭視頻流進(jìn)行測試,看看是否正常輸出。
將攝像頭rtsp視頻流,配置到easyNvr的通道后,點(diǎn)擊預(yù)覽查看視頻能否正確輸出。
在預(yù)覽界面,其他設(shè)置一欄中,可以查看HLS的.m3u8地址。
采用video.js開源的視頻插件編碼,調(diào)用.m3u8地址,在H5端成功展示視頻。
通過項(xiàng)目中實(shí)際的應(yīng)用,HLS直播在無論是在實(shí)時(shí)性、連續(xù)性還是多用戶并發(fā)控制方面都達(dá)到了我們預(yù)期的目標(biāo)。
原文 H5直播RTSP攝像頭視頻流解決方案 - 掘金
*請認(rèn)真填寫需求信息,我們會在24小時(shí)內(nèi)與您取得聯(lián)系。