做視訊直播這一塊,前期研究了很多方案,包括websocket,因為各種原因最後沒有採取這個方案,但還是想記錄一下學習的心得。
WebSocket是HTML5開始提供的一種在單一TCP 連線上進行全雙工通訊的協定。
在WebSocket API中,瀏覽器和伺服器只需要做一個握手的動作,然後,瀏覽器和伺服器之間就形成了一條快速通道。兩者之間就直接可以資料互相傳送。
瀏覽器透過JavaScript 向伺服器發出建立WebSocket 連線的請求,連線建立以後,客戶端和伺服器端就可以透過TCP 連線直接交換資料。
當你取得Web Socket 連線後,你可以透過send()方法來向伺服器發送數據,並透過onmessage事件來接收伺服器傳回的資料。
在做的過程中,主要的思維是:在錄影頁面利用setTimeout()每隔固定的時間透過canvas將影片轉換為一幀一幀的圖像,然後用websocket的socket.send()將圖片資料傳送給伺服器。在直播頁面就是先創建一個<img>的結構,透過websocket的socket.onmessage()取得到圖像數據,並展示<img>標籤上,形成直播。
附上程式碼
錄影頁面HTML結構
<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> //建立一個+實例var socket = new WebSocket(ws://+document.domain+:8080); var back = document.getElementById('output'); / /傳回一個用於在畫布上繪圖的環境。 var backcontext = back.getContext('2d'); var video = document.getElementsByTagName('video')[0]; var success = function(stream){ //取得視屏流,轉換為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的內容轉換成PNG data URI並傳送到伺服器,0.5為和壓縮係數socket.send( back.toDataURL(image/jpeg, 0.5)); } setTimeout(draw, 100); } //呼叫裝置的相機,並將資源放入video標籤navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia navigator.mozGetUserMedia || navigator.msGetUserMedia navigator. audio:false}, success, console.log); </script>
直播頁面HTML結構:
<img id=receiver style=width:1600px;height:900px/>
直播頁面JS
<script type=text/javascript charset=utf-8> //建立一個socket實例var receiver_socket = new WebSocket(ws://+document.domain+:8008); alert(ws://+document.domain+:8008) var image = document.getElementById('receiver'); //監聽訊息receiver_socket.onmessage = function(data) { image.src=data.data; } </script>總結
以上所述是小編給大家介紹的HTML5中的websocket實現直播功能,希望對大家有幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對VeVb武林網站的支持!