HTML5中的websocket實(shí)現(xiàn)直播功能

做視頻直播這一塊,前期研究了很多方案,包括websocket,因?yàn)楦鞣N原因最后沒(méi)有采取這個(gè)方案,但還是想記錄一下學(xué)習(xí)的心得。
WebSocket是HTML5開(kāi)始提供的一種在單個(gè) TCP 連接上進(jìn)行全雙工通訊的協(xié)議。
在WebSocket API中,瀏覽器和服務(wù)器只需要做一個(gè)握手的動(dòng)作,然后,瀏覽器和服務(wù)器之間就形成了一條快速通道。兩者之間就直接可以數(shù)據(jù)互相傳送。
瀏覽器通過(guò) JavaScript 向服務(wù)器發(fā)出建立 WebSocket 連接的請(qǐng)求,連接建立以后,客戶(hù)端和服務(wù)器端就可以通過(guò) TCP 連接直接交換數(shù)據(jù)。
當(dāng)你獲取 Web Socket 連接后,你可以通過(guò)send()方法來(lái)向服務(wù)器發(fā)送數(shù)據(jù),并通過(guò)onmessage事件來(lái)接收服務(wù)器返回的數(shù)據(jù)。
做的過(guò)程中,主要的思維是:在錄像頁(yè)面利用setTimeout()每隔固定的時(shí)間通過(guò)canvas將視頻轉(zhuǎn)化為一幀一幀的圖像,然后用websocket的socket.send()將圖片數(shù)據(jù)發(fā)送給服務(wù)器。在直播頁(yè)面就是先創(chuàng)建一個(gè)<img>的結(jié)構(gòu),通過(guò)websocket的socket.onmessage()獲取到圖像數(shù)據(jù),并展示<img>標(biāo)簽上,形成直播。
附上代碼
錄像頁(yè)面HTML結(jié)構(gòu)
<video autoplay id="sourcevid" style="width:1600;height:900px"></video> <canvas id="output" style="display:none"></canvas>
錄像頁(yè)面js
<script type="text/javascript" charset="utf-8"> //創(chuàng)建一個(gè)+實(shí)例 var socket = new WebSocket("ws://"+document.domain+":8080"); var back = document.getElementById('output'); //返回一個(gè)用于在畫(huà)布上繪圖的環(huán)境。 var backcontext = back.getContext('2d'); var video = document.getElementsByTagName('video')[0]; var success = function(stream){ //獲取視屏流,轉(zhuǎn)換為url video.src = window.URL.createObjectURL(stream); } //打開(kāi)socket socket.onopen = function(){ draw(); console.log("open success") } // 將視頻幀繪制到Canvas對(duì)象上,Canvas每100ms切換幀,形成肉眼視頻效果 var draw = function(){ try{ backcontext.drawImage(video,0,0, back.width, back.height); }catch(e){ if (e.name == "NS_ERROR_NOT_AVAILABLE") { return setTimeout(draw, 100); } else { throw e; } } if(video.src){ // Canvas的內(nèi)容轉(zhuǎn)化成PNG data URI并發(fā)送到服務(wù)器,0.5為和壓縮系數(shù) socket.send(back.toDataURL("image/jpeg", 0.5)); } setTimeout(draw, 100); } //調(diào)用設(shè)備的攝像頭,并將資源放入video標(biāo)簽 navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; navigator.getUserMedia({video:true, audio:false}, success, console.log); </script>
直播頁(yè)面HTML結(jié)構(gòu):
<img id="receiver" style="width:1600px;height:900px"/>
直播頁(yè)面JS
<script type="text/javascript" charset="utf-8"> //創(chuàng)建一個(gè)socket實(shí)例 var receiver_socket = new WebSocket("ws://"+document.domain+":8008"); alert("ws://"+document.domain+":8008") var image = document.getElementById('receiver'); // 監(jiān)聽(tīng)消息 receiver_socket.onmessage = function(data) { image.src=data.data; } </script>
總結(jié)
以上所述是小編給大家介紹的HTML5中的websocket實(shí)現(xiàn)直播功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
HTML5 WebSocket實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)聊天的示例代碼
這篇文章主要介紹了HTML5 WebSocket實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)聊天的示例代碼的相關(guān)資料,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-31HTML5 WebSocket權(quán)威指南 PDF掃描版[75MB]
本書(shū)系統(tǒng)、全面地講解了HTML5WebSocket的各個(gè)方面,是Web開(kāi)發(fā)人員和架構(gòu)師學(xué)習(xí)WebSocket的最佳選擇,內(nèi)容包括:WebSocketAPI和協(xié)議、WebSocket協(xié)議通信的例子、WebSocket的2016-12-22HTML5-WebSocket實(shí)現(xiàn)聊天室示例
本篇文章主要介紹了HTML5-WebSocket實(shí)現(xiàn)聊天室示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-12-15- 這篇文章主要介紹了淺析HTML5的WebSocket與服務(wù)器推送事件,WebSocket API最大的特點(diǎn)就是讓服務(wù)器和客戶(hù)端能在給定的時(shí)間范圍內(nèi)的任意時(shí)刻,相互推送信息,需要的朋友可以參2016-02-19
html5的websockets全雙工通信詳解學(xué)習(xí)示例
本文主要研究HTML5 WebSockets的使用方法,它是HTML5中最強(qiáng)大的通信功能,定義了一個(gè)全雙工的通信信道,只需Web上的一個(gè)Socket即可進(jìn)行通信,能減少不必要的網(wǎng)絡(luò)流量并降低2014-02-26利用html5的websocket實(shí)現(xiàn)websocket聊天室
利用html5的websocket實(shí)現(xiàn)一個(gè)聊天室,大家可以參考使用2013-12-12html5-websocket基于遠(yuǎn)程方法調(diào)用的數(shù)據(jù)交互實(shí)現(xiàn)
一般在傳統(tǒng)網(wǎng)頁(yè)中注冊(cè)用戶(hù)信息都是通過(guò)post或ajax提交到頁(yè)面處理,到了HTML5后我們有另一種方法就是通過(guò)websocket進(jìn)行數(shù)據(jù)交互,接下來(lái)將詳細(xì)介紹,需要了解的朋友可以參考下2012-12-04HTML5+WebSocket實(shí)現(xiàn)多文件同時(shí)上傳的實(shí)例
本篇文章主要介紹了HTML5-WebSocket實(shí)現(xiàn)多文件同時(shí)上傳的實(shí)例,HTML5結(jié)合Websocket進(jìn)行文件的傳輸就變得更加方便和靈活,有興趣的可以了解一下。2016-12-29帶你認(rèn)識(shí)HTML5中的WebSocket
這篇文章主要介紹了帶你認(rèn)識(shí)HTML5中的WebSocket,本文講解了HTML5 中的 WebSocket API 是個(gè)什么東東、HTML5 中的 WebSocket API 的用法、帶Socket.IO的WebSocket、NodeJS和S2015-05-22