HTML5中的websocket實現直播

做視頻直播這一塊,前期研究了很多方案,包括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.getUserMedia({video:true, 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>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章