頻直播是借助流媒體及通信技術,通過采集、編碼、發布和播放等過程實現實時播放。近年來,隨著移動互聯網的發展,企業的移動端應用日漸增長,手機直播需求也應運而生。根據業務需求,需在App端和H5端調用攝像頭視頻流,來達到現場生產作業直播的目的。
我廠安裝的攝像頭,主要由??低?、大華和英飛拓三個品牌構成,輸出協議均為RTSP。App端支持直接播放RTSP協議的視頻流,但無法直接在H5端顯示。故欲達到在H5端直播的目的,需要將RTSP協議轉換成RTMP或HLS協議。
常見流媒體協議:
1、RTSP協議:英文全稱 Real Time Streaming Protocol,RFC2326,實時流傳輸協議,是TCP/IP協議體系中的一個應用層協議!協議主要規定定了一對多應用程序如何有效地通過IP網絡傳送多媒體數據。RTSP體系結位于RTP和RTCP之上(RTCP用于控制傳輸,RTP用于數據傳輸),使用TCP或UDP完成數據傳輸!
2、RTMP協議:RTMP協議是Real Time Message Protocol(實時信息傳輸協議)的縮寫,它是由Adobe公司提出的一種應用層的協議,用來解決多媒體數據傳輸流的多路復用(Multiplexing)和分包(packetizing)的問題。
3、HLS協議:HTTP Live Streaming,是Apple的開放標準,基于HTTP流,它最初是蘋果公司針對蘋果移動設備而開發的流,由于是基于HTTP的,因此很多HTTP的優點都得到了繼承。
RTMP協議支持在Html播放,但是它依賴flash播放器,所以在移動端H5不能采用RTMP協議。HLS協議基于HTTP流,支持IOS、Android、HTML5,故采取將RTSP拉流并轉碼為HLS協議輸出的方式,下圖是HLS的工作原理:
2 架構設計
考慮到內網帶寬限制及多用戶并發以及便于管理,我們采用流媒體服務器(內外網映射、拉流/轉碼)+web服務器+手機App+H5的方案,其中流媒體服務器負責拉取攝像頭RTSP視頻流,并壓縮編碼成HLS,等待來自手機App+H5的request請求;WEB服務器用于管理攝像頭信息;H5端通過video.js開源插件實現播放,架構圖如下:
3 具體實現
為了保證系統穩定性及管理便捷性,我們使用了EasyNVR流媒體服務器軟件,EasyNVR集成了可視化web管理服務,能夠通過簡單的網絡攝像機通道配置,將傳統監控行業里面的高清網絡攝像機IP Camera、NVR等具有RTSP協議輸出的設備接入到EasyNVR,EasyNVR能夠將這些視頻源的音視頻數據進行拉取,轉換為RTMP或HLS,進行全平臺終端H5直播(Web、Android、iOS)
相關學習資料推薦,點擊下方鏈接免費報名,先碼住不迷路~】
音視頻免費學習地址:https://xxetb.xet.tech/s/2cGd0
【免費分享】音視頻學習資料包、大廠面試題、技術視頻和學習路線圖,資料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以點擊788280672加群免費領取~
1、安裝流媒體服務器軟件EasyNVR
在EasyNVR官網下載安裝包,解壓后運行ServiceInstall-EasyNVR.exe進行安裝,成功將啟動web管理界面。
我們以??低晹z像頭為例,首先在攝像頭機web管理界面(默認入口是攝像頭ip地址),在網絡菜單配置里了,開通UPnP端口,以及RTSP視頻流的映射。
開通映射以后,UPnP狀態顯示生效。
根據??低晹z像頭的視頻流格式,拼出該攝像頭的RTSP地址,如:rtsp://賬號:密碼@http://172.16.xxx.xxx:554/h264/ch35/main/av_stream
可使用VLC media player軟件對攝像頭視頻流進行測試,看看是否正常輸出。
將攝像頭rtsp視頻流,配置到easyNvr的通道后,點擊預覽查看視頻能否正確輸出。
在預覽界面,其他設置一欄中,可以查看HLS的.m3u8地址。
采用video.js開源的視頻插件編碼,調用.m3u8地址,在H5端成功展示視頻。
通過項目中實際的應用,HLS直播在無論是在實時性、連續性還是多用戶并發控制方面都達到了我們預期的目標。
原文 H5直播RTSP攝像頭視頻流解決方案 - 掘金
同學問道:需要實時播放攝像頭rtsp視頻流,而瀏覽器不能直接播放,怎樣解決?
實現這個需求可以通過插件或者轉碼來實現。
要實現這個目的,可以采用的方案非常得多,有商業的也有開源的,這里主要列舉一些開源的方案。這里的方案都是我嘗試過了的,有些成功,有些沒成功。但是因為每個項目情況不同,這次沒成的方法,換個項目也許就能成。
C++音視頻開發學習資料:點擊莬費領取→音視頻開發(資料文檔+視頻教程+面試題)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)
實現原理
實現步驟
<video id="test_video" controls autoplay></video>
<script src="free.player.1.8.4.js"></script>
<script>
if (window.Streamedian) {
var errHandler=function(err){
console.log('err', err.message);
};
var infHandler=function(inf) {
console.log('info', inf)
};
var playerOptions={
socket: "ws://localhost:8088/ws/",
redirectNativeMediaErrors : true,
bufferDuration: 30,
errorHandler: errHandler,
infoHandler: infHandler
};
var html5Player=document.getElementById("test_video");
html5Player.src="rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov";
var player=Streamedian.player('test_video', playerOptions);
window.onbeforeunload=function(){
player && player.destroy();
player=null;
Request=null;
}
}
</script>
注意:測試時先從官網申請license key,否則socket 只能識別localhost和127.0.0.1
優缺點
C++音視頻開發學習資料:點擊莬費領取→音視頻開發(資料文檔+視頻教程+面試題)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)
rtmp是adobe開發的協議,一般使用adobe media server 可以方便的搭建起來;隨著開源時代的到來,有大神開發了nginx的rtmp插件,也可以直接使用nginx實現rtmp
rtmp方式的最大的優點在于低延時,經過測試延時普遍在1-3秒,可以說很實時了;缺點在于它是adobe開發的,rtmp的播放嚴重依賴flash,而由于flash本身的安全,現代瀏覽器大多禁用flash
實現步驟
rtmp{
server{
listen 1935;
application live{
live on;
record off;
}
application hls{
live on;
hls on;
hls_path nginx-rtmp-module/hls;
hls_cleanup off;
}
}
}
4.ffmpeg轉碼
ffmpeg -i "rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov" -f flv -r 25 -s 1080*720 -an "rtmp://127.0.0.1:1935/hls/mystream"
5.video 播放
<html>
<head>
<title>video</title>
<!-- 引入css -->
<link rel="stylesheet" type="text/css" href="./videojs/video-js.min.css" />
</head>
<body>
<video id="test_video" class="video-js vjs-default-skin vjs-big-play-centered" controls autoplay>
<source src='rtmp://127.0.0.1:1935/hls/mystream' type='rtmp/flv'/>
</video>
</body>
</html>
<!-- 引入js -->
<script type="text/javascript" src="./videojs/video.min.js"></script>
<script type="text/javascript" src="./videojs/videojs-flash.js"></script>
<script>
videojs.options.flash.swf="./videojs/video-js.swf"
var player=videojs('test_video', {"autoplay":true});
player.play();
</script>
注意:使用谷歌瀏覽器播放時,需要開啟flash允許
C++音視頻開發學習資料:點擊莬費領取→音視頻開發(資料文檔+視頻教程+面試題)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)
HLS (HTTP Live Streaming) 直播 是有蘋果提出的一個基于http的協議。其原理是把整個流切分成一個個的小視頻文件,然后通過一個m3u8的文件列表來管理這些視頻文件
HTTP Live Streaming 并不是一個真正實時的流媒體系統,這是因為對應于媒體分段的大小和持續時間有一定潛在的時間延時。在客戶端,至少在一個分段媒體文件被完全下載后才能夠開始播放,而通常要求下載完兩個媒體文件之后才開始播放以保證不同分段音視頻之間的無縫連接。
此外,在客戶端開始下載之前,必須等待服務器端的編碼器和流分割器至少生成一個TS文件,這也會帶來潛在的時延。
服務器軟件將接收到的流每緩存一定時間后包裝為一個新的TS文件,然后更新m3u8文件。m3u8文件中只保留最新的幾個片段的索引,以保證觀眾任何時候連接進來都會看到較新的內容,實現近似直播的效果。
這種方式的理論最小延時為一個ts文件的時長,一般為2-3個ts文件的時長。
實現步驟
ffmpeg -i "rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov" -c copy -f hls -hls_time 2.0 -hls_list_size 0 -hls_wrap 15 "D:/Program Files/html/hls/test.m3u8"
ffmpeg 關于hls方面的指令說明
3.video 播放
<html>
<head>
<title>video</title>
<!-- 引入css -->
<link rel="stylesheet" type="text/css" href="./videojs/video-js.min.css" />
</head>
<body>
<div class="videoBox">
<video id="my_video_1" class="video-js vjs-default-skin" controls>
<source src="http://localhost:8088/hls/test.m3u8" type="application/x-mpegURL">
</video>
</div>
</body>
</html>
<script type="text/javascript" src="./videojs/video.min.js"></script>
<script type="text/javascript" src="./videojs/videojs-contrib-hls.min.js"></script>
<script>
videojs.options.flash.swf="./videojs/video-js.swf"
var player=videojs('my_video_1', {"autoplay":true});
player.play();
</script>
C++音視頻開發學習資料:點擊莬費領取→音視頻開發(資料文檔+視頻教程+面試題)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)
播放步驟
<object type='application/x-vlc-plugin' pluginspage="http://www.videolan.org/" id='vlc' events='false' width="720" height="410">
<param name='mrl' value='rtsp://admin:12345@192.168.10.235:554/h264/ch1/main/av_stream' />
<param name='volume' value='50' />
<param name='autoplay' value='true' />
<param name='loop' value='false' />
<param name='fullscreen' value='false' />
<param name='controls' value='false' />
</object>
優缺點
WebRTC 是支持網頁瀏覽器進行實時音視頻的一套API,例如:HTML5 通過 webRTC 直接調用攝像頭,但是如果要實現遠程視頻流的顯示,則需要將 RTSP 轉換為 WebRTC 流,供 web 端顯示。
如果你對音視頻開發感興趣,或者對本文的一些闡述有自己的看法,可以在下方的留言框,一起探討。
者:竹之同學
轉發鏈接:https://segmentfault.com/a/1190000022994032
*請認真填寫需求信息,我們會在24小時內與您取得聯系。