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
近項(xiàng)目中需要實(shí)時(shí)播放攝像頭rtsp視頻流,于是就專門做了些研究。而瀏覽器不能直接播放,只有通過(guò)插件或者轉(zhuǎn)碼來(lái)實(shí)現(xiàn)這個(gè)需求。
要實(shí)現(xiàn)這個(gè)目的,可以采用的方案非常得多,有商業(yè)的也有開源的,這里主要列舉一些開源的方案。這里的方案都是我嘗試過(guò)了的,有些成功,有些沒(méi)成功。但是因?yàn)槊總€(gè)項(xiàng)目情況不同,這次沒(méi)成的方法,換個(gè)項(xiàng)目也許就能成。
方案一: html5 + websocket_rtsp_proxy 實(shí)現(xiàn)視頻流直播
實(shí)現(xiàn)原理
實(shí)現(xiàn)步驟
<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>
注意:測(cè)試時(shí)先從官網(wǎng)申請(qǐng)license key,否則socket 只能識(shí)別localhost和127.0.0.1
優(yōu)缺點(diǎn)
參考鏈接
rtmp是adobe開發(fā)的協(xié)議,一般使用adobe media server 可以方便的搭建起來(lái);隨著開源時(shí)代的到來(lái),有大神開發(fā)了nginx的rtmp插件,也可以直接使用nginx實(shí)現(xiàn)rtmp
rtmp方式的最大的優(yōu)點(diǎn)在于低延時(shí),經(jīng)過(guò)測(cè)試延時(shí)普遍在1-3秒,可以說(shuō)很實(shí)時(shí)了;缺點(diǎn)在于它是adobe開發(fā)的,rtmp的播放嚴(yán)重依賴flash,而由于flash本身的安全,現(xiàn)代瀏覽器大多禁用flash
相關(guān)學(xué)習(xí)資料推薦,點(diǎn)擊下方鏈接免費(fèi)報(bào)名,先碼住不迷路~】
音視頻免費(fèi)學(xué)習(xí)地址:FFmpeg/WebRTC/RTMP/NDK/Android音視頻流媒體高級(jí)開發(fā)
【免費(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)取~
實(shí)現(xiàn)步驟
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;
}
}
}
ffmpeg轉(zhuǎn)碼
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"
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>
注意:使用谷歌瀏覽器播放時(shí),需要開啟flash允許
參考鏈接
方案三:ffmpeg + video,rtsp轉(zhuǎn)hls播放
HLS (HTTP Live Streaming) 直播 是有蘋果提出的一個(gè)基于http的協(xié)議。其原理是把整個(gè)流切分成一個(gè)個(gè)的小視頻文件,然后通過(guò)一個(gè)m3u8的文件列表來(lái)管理這些視頻文件
HTTP Live Streaming 并不是一個(gè)真正實(shí)時(shí)的流媒體系統(tǒng),這是因?yàn)閷?duì)應(yīng)于媒體分段的大小和持續(xù)時(shí)間有一定潛在的時(shí)間延時(shí)。在客戶端,至少在一個(gè)分段媒體文件被完全下載后才能夠開始播放,而通常要求下載完兩個(gè)媒體文件之后才開始播放以保證不同分段音視頻之間的無(wú)縫連接。
此外,在客戶端開始下載之前,必須等待服務(wù)器端的編碼器和流分割器至少生成一個(gè)TS文件,這也會(huì)帶來(lái)潛在的時(shí)延。
服務(wù)器軟件將接收到的流每緩存一定時(shí)間后包裝為一個(gè)新的TS文件,然后更新m3u8文件。m3u8文件中只保留最新的幾個(gè)片段的索引,以保證觀眾任何時(shí)候連接進(jìn)來(lái)都會(huì)看到較新的內(nèi)容,實(shí)現(xiàn)近似直播的效果。
這種方式的理論最小延時(shí)為一個(gè)ts文件的時(shí)長(zhǎng),一般為2-3個(gè)ts文件的時(shí)長(zhǎng)。
實(shí)現(xiàn)步驟
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 關(guān)于hls方面的指令說(shuō)明
<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>
參考鏈接
方案四:VLC插件播放
播放步驟
<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>
優(yōu)缺點(diǎn)
參考鏈接
其他方案
WebRTC
WebRTC 是支持網(wǎng)頁(yè)瀏覽器進(jìn)行實(shí)時(shí)音視頻的一套API,例如:HTML5 通過(guò) webRTC 直接調(diào)用攝像頭,但是如果要實(shí)現(xiàn)遠(yuǎn)程視頻流的顯示,則需要將 RTSP 轉(zhuǎn)換為 WebRTC 流,供 web 端顯示。
參考地址:github.com/lulop-k/kur…
h5stream
參考地址:
參考地址:
參考地址
原文 瀏覽器播放rtsp視頻流解決方案 - 掘金
爬取視頻的時(shí)候發(fā)現(xiàn),現(xiàn)在的視頻都是經(jīng)過(guò)加密(m3u8),不再是mp4或者avi鏈接直接在網(wǎng)頁(yè)顯示,都是經(jīng)過(guò)加密形成ts文件分段進(jìn)行播放。
今天就教大家如果通過(guò)python爬取下載m3u8加密視頻。
http://www.caisetv.com/
http://www.caisetv.com/dongzuopian/chaidanzhuanjia/0-1.html
在視頻播放的頁(yè)面,通過(guò)F12可以查看網(wǎng)絡(luò)數(shù)據(jù)包
https://xigua-cdn.haima-zuida.com/20210219/19948_fcbc225a/1000k/hls/index.m3u8
這里的ts就電影的加密分段視頻
https://xigua-cdn.haima-zuida.com/20210219/19948_fcbc225a/1000k/hls/
上面的m3u8鏈接掉index.m3u8后,在拼上075a34cccdd000000.ts等ts名稱就是分段視頻的鏈接
如下所示:
https://xigua-cdn.haima-zuida.com/20210219/19948_fcbc225a/1000k/hls/075a34cccdd000000.ts
通過(guò)瀏覽器把這個(gè)分段視頻下載后打開:
所以只要把所有的ts下載并合并就是完整的電影視頻!!!
剛剛已經(jīng)把ts的所有名稱下載下來(lái)了
接下來(lái)通過(guò)python代碼去讀取這個(gè)文件,提取出名稱,拼接鏈接后下載保存到一個(gè)文件夾里!
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0',}
###下載ts文件
def download(url,name):
r = requests.get(url, headers=headers)
with open(name+"", "wb") as code:
code.write(r.content)
with open("index.m3u8","r") as f:
ts_list = f.readlines()
#去掉前面沒(méi)用的信息
ts_list = ts_list[5:]
urlheader="https://xigua-cdn.haima-zuida.com/20210219/19948_fcbc225a/1000k/hls/"
count = 0
for i in ts_list:
if "#" not in i:
i = i.replace("\n","")
download(urlheader+""+i,"cdzj2/"+str(count)+".ts")
count = count+1
print(count)
這樣就可以把ts文件全部下載下來(lái),但是一個(gè)一個(gè)下載很慢,下面通過(guò)多線程下載,提升下載速度!!!
for i in ts_list:
if "#" not in i:
i = i.replace("\n","")
n = i[-7:]
threading.Thread(target=download, args=(urlheader+""+i,"cdzj2/"+str(n),)).start()
#download(urlheader+""+i,"cdzj2/"+str(count)+".ts")
通過(guò)多線程很快就可以將這些ts文件下載到本地!!!
copy /b *.ts new.mp4
通過(guò)這個(gè)命令(cmd終端中運(yùn)行),在含有ts文件的文件夾中就可以將ts文件合并(按名稱順序進(jìn)行排列合并),并保存成new.mp4
1.分析m3u8加密文件
2.python下載ts文件
3.cmd合并ts保存成mp4格式
AVASCRIPT WEBUPLOADER 分塊上傳,JAVASCRIPT 分段上傳,WEBUPLOADER 分塊上傳,JAVASCRIPT WEBUPLOADER 分片上傳,JAVASCRIPT 分割上傳,WEBUPLOADER 切割上傳,JAVASCRIPT 分塊上傳斷點(diǎn)續(xù)傳,WEBUPLOADER 分片上傳,WEBUPLOADER 加密上傳,WEBUPLOADER 分片秒傳,WEBUPLOADER 斷點(diǎn)續(xù)傳,WEBUPLOADER 加密上傳,WEBUPLOADER 分片下載,WEBUPLOADER 多線程上傳,WEBUPLOADER 文件夾上傳,
用戶上傳的文件比較大,有20G左右,直接用HTML傳的話容易失敗,服務(wù)器也容易出錯(cuò),需要分片,分塊,分割上傳。也就是將一個(gè)大的文件分成若干個(gè)小文件塊來(lái)上傳,另外就是需要實(shí)現(xiàn)秒傳功能和防重復(fù)功能,秒傳就是用戶如果上傳過(guò)這個(gè)文件,那么直接在數(shù)據(jù)庫(kù)中查找記錄就行了,不用再上傳一次,節(jié)省時(shí)間,實(shí)現(xiàn)的思路是對(duì)文件做MD5計(jì)算,將MD5值保存到數(shù)據(jù)庫(kù),算法可以用MD5,或者CRC,或者SHA1,這個(gè)隨便哪個(gè)算法都行。
分片還需要支持?jǐn)帱c(diǎn)續(xù)傳,現(xiàn)在HTML5雖然提供了信息記錄功能,但是只支持到了會(huì)話級(jí),也就是用戶不能關(guān)閉瀏覽器,也不能清空緩存。但是有的政府單位上傳大文件,傳了一半下班了,明天繼續(xù)傳,電腦一關(guān)結(jié)果進(jìn)度信息就丟失了,這個(gè)是他們的一個(gè)痛點(diǎn)。
切片的話還有一點(diǎn)就是在服務(wù)器上合并,一個(gè)文件的所有分片數(shù)據(jù)上傳完后需要在服務(wù)器端進(jìn)行合并操作。
聊下HTML5吧,怎么說(shuō)呢,HTML5也就是chrome提供的一個(gè)API來(lái)實(shí)現(xiàn)文件分片,反正基本的需求,小文件用是能用,但是用起來(lái)多多少少還是有點(diǎn)別扭,擴(kuò)展性,安全性,穩(wěn)定性用戶那陣都不太滿意,關(guān)鍵是什么,我們是沒(méi)辦法對(duì)HTML5進(jìn)行擴(kuò)展,個(gè)性化和定制化開發(fā)的,基本上被谷歌給限制死了,這也是現(xiàn)在國(guó)產(chǎn)化的意義,希望能夠打破這個(gè)限制。不然公司的一些產(chǎn)品和業(yè)務(wù)不太好開展,總不能用戶提個(gè)需求,我們就說(shuō)谷歌Chrome沒(méi)提供API,所我們就無(wú)法開發(fā)吧。這不是跟客戶扯呢。
功能的話支持20G文件上傳和續(xù)傳,支持秒傳,支持文件夾上傳,支持在服務(wù)端保存文件夾層級(jí)結(jié)構(gòu),支持將文件夾層級(jí)結(jié)構(gòu)信息保存到數(shù)據(jù)庫(kù)中,支持下載時(shí)能夠?qū)⑽募A層級(jí)結(jié)構(gòu)下載下來(lái),支持下載文件夾,下載文件夾支持?jǐn)帱c(diǎn)續(xù)傳,支持VUE2,VUE3,React,支持IE,Chrome和信創(chuàng)國(guó)產(chǎn)化環(huán)境,比如銀河麒麟,統(tǒng)信UOS,龍芯,支持加密傳輸,包括加密上傳,加密下載,加密算法支持國(guó)密SM4,支持云對(duì)象存儲(chǔ),比如華為云,阿里云,騰訊云,七牛云,AWS,MinIO,FastDFS,需要提供手機(jī),QQ,微信,郵箱等聯(lián)系方式,提供7*24小時(shí)技術(shù)支持,提供長(zhǎng)期技術(shù)支持和維護(hù)服務(wù),提供遠(yuǎn)程1對(duì)1技術(shù)指導(dǎo),提供二次開發(fā)指導(dǎo),提供文檔教程,提供視頻教程。
1.下載示例
https://gitee.com/xproer/up6-vue-cli
將up6組件復(fù)制到項(xiàng)目中
示例中已經(jīng)包含此目錄
1.引入up6組件
2.配置接口地址
接口地址分別對(duì)應(yīng):文件初始化,文件數(shù)據(jù)上傳,文件進(jìn)度,文件上傳完畢,文件刪除,文件夾初始化,文件夾刪除,文件列表
參考:http://www.ncmem.com/doc/view.aspx?id=e1f49f3e1d4742e19135e00bd41fa3de
3.處理事件
啟動(dòng)測(cè)試
啟動(dòng)成功
效果
數(shù)據(jù)庫(kù)
源碼工程文檔:https://drive.weixin.qq.com/s?k=ACoAYgezAAw1dWofra
源碼報(bào)價(jià)單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwoiul8gl
控件源碼下載:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。