做視頻直播這一塊,前期研究了很多方案,包括websocket,因為各種原因最后沒有采取這個方案,但還是想記錄一下學(xué)習(xí)的心得。
WebSocket是HTML5開始提供的一種在單個 TCP 連接上進(jìn)行全雙工通訊的協(xié)議。
在WebSocket API中,瀏覽器和服務(wù)器只需要做一個握手的動作,然后,瀏覽器和服務(wù)器之間就形成了一條快速通道。兩者之間就直接可以數(shù)據(jù)互相傳送。
瀏覽器通過 JavaScript 向服務(wù)器發(fā)出建立 WebSocket 連接的請求,連接建立以后,客戶端和服務(wù)器端就可以通過 TCP 連接直接交換數(shù)據(jù)。
當(dāng)你獲取 Web Socket 連接后,你可以通過send()方法來向服務(wù)器發(fā)送數(shù)據(jù),并通過onmessage事件來接收服務(wù)器返回的數(shù)據(jù)。
做的過程中,主要的思維是:在錄像頁面利用setTimeout()每隔固定的時間通過canvas將視頻轉(zhuǎn)化為一幀一幀的圖像,然后用websocket的socket.send()將圖片數(shù)據(jù)發(fā)送給服務(wù)器。在直播頁面就是先創(chuàng)建一個<img>的結(jié)構(gòu),通過websocket的socket.onmessage()獲取到圖像數(shù)據(jù),并展示<img>標(biāo)簽上,形成直播。
附上代碼
錄像頁面HTML結(jié)構(gòu)
<video autoplay id="sourcevid" style="width:1600;height:900px"></video> <canvas id="output" style="display:none"></canvas>
錄像頁面js
<script type="text/javascript" charset="utf-8"> //創(chuàng)建一個+實例 var socket = new WebSocket("ws://"+document.domain+":8080"); var back = document.getElementById('output'); //返回一個用于在畫布上繪圖的環(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); } //打開socket socket.onopen = function(){ draw(); console.log("open success") } // 將視頻幀繪制到Canvas對象上,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>
直播頁面HTML結(jié)構(gòu):
<img id="receiver" style="width:1600px;height:900px"/>
直播頁面JS
<script type="text/javascript" charset="utf-8"> //創(chuàng)建一個socket實例 var receiver_socket = new WebSocket("ws://"+document.domain+":8008"); alert("ws://"+document.domain+":8008") var image = document.getElementById('receiver'); // 監(jiān)聽消息 receiver_socket.onmessage = function(data) { image.src=data.data; } </script>
總結(jié)
以上所述是小編給大家介紹的HTML5中的websocket實現(xiàn)直播功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
標(biāo)簽:淮安 南京 西寧 廣西 佳木斯 咸寧 十堰 酒泉
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《HTML5中的websocket實現(xiàn)直播功能》,本文關(guān)鍵詞 HTML5,中的,websocket,實現(xiàn),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。