HTML5中的websocket实现直播功能


Posted in HTML / CSS onMay 21, 2018

做视频直播这一块,前期研究了很多方案,包括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>

总结

以上所述是小编给大家介绍的HTML5中的websocket实现直播功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

HTML / CSS 相关文章推荐
让IE可以变相支持CSS3选择器
Jan 21 HTML / CSS
CSS3盒子模型详解
Apr 24 HTML / CSS
css3实现可滑动跳转的分页插件示例
May 08 HTML / CSS
通过一张图教会你CSS3倒影的实现
Sep 26 HTML / CSS
CSS3实现菜单悬停效果
Nov 17 HTML / CSS
用HTML5实现手机摇一摇的功能的教程
Oct 30 HTML / CSS
html5 datalist标签使用示例(自动完成组件)
May 04 HTML / CSS
浅谈html5 响应式布局
Dec 24 HTML / CSS
HTML5页面中尝试调起APP功能
Sep 12 HTML / CSS
canvas绘制视频封面的方法
Feb 05 HTML / CSS
通过canvas转换颜色为RGBA格式及性能问题的解决
Nov 22 HTML / CSS
CSS使用伪类控制边框长度的方法
Jan 18 HTML / CSS
深入浅析HTML5中的article和section的区别
May 15 #HTML / CSS
HTML5触摸事件实现移动端简易进度条的实现方法
May 04 #HTML / CSS
HTML5声音录制/播放功能的实现代码
May 03 #HTML / CSS
HTML5离线应用与客户端存储的实现
May 03 #HTML / CSS
浅谈Html5多线程开发之WebWorkers
May 02 #HTML / CSS
html5的input的required使用中遇到的问题及解决方法
Apr 24 #HTML / CSS
HTML5轻松实现全屏视频背景的示例
Apr 23 #HTML / CSS
You might like
WordPress中&quot;无法将上传的文件移动至&quot;错误的解决方法
2015/07/01 PHP
javascript生成/解析dom的CDATA类型的字段的代码
2007/04/22 Javascript
经常用的图片在容器中的水平垂直居中实例
2007/06/10 Javascript
jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)
2010/10/20 Javascript
jQuery学习总结之元素的相对定位和选择器(持续更新)
2011/04/26 Javascript
JavaScript Scoping and Hoisting 翻译
2012/07/03 Javascript
node.js中的fs.mkdir方法使用说明
2014/12/17 Javascript
jQuery中:last-child选择器用法实例
2014/12/31 Javascript
javascript获取系统当前时间的方法
2015/11/19 Javascript
JavaScript知识点总结(十)之this关键字
2016/05/31 Javascript
AngularJS 指令的交互详解及实例代码
2016/09/14 Javascript
基于javascript的Form表单验证
2016/12/29 Javascript
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
[02:00]DAC2018主宣传片——龙征四海,剑问东方
2018/03/20 DOTA
[01:12:44]VG vs Mineski Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
Python中实现远程调用(RPC、RMI)简单例子
2014/04/28 Python
django中静态文件配置static的方法
2018/05/20 Python
Python 读取某个目录下所有的文件实例
2018/06/23 Python
Python 实现中值滤波、均值滤波的方法
2019/01/09 Python
python实现的读取网页并分词功能示例
2019/10/29 Python
python 二维矩阵转三维矩阵示例
2019/11/30 Python
Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
2020/02/11 Python
渗透攻击的测试步骤
2014/06/07 面试题
优秀毕业大学生推荐信
2013/11/13 职场文书
电子商务专业个人的自我评价
2013/11/19 职场文书
工程专业求职自荐书范文
2014/02/08 职场文书
家长通知书家长评语
2014/04/17 职场文书
环保建议书600字
2014/05/14 职场文书
企业安全生产承诺书
2014/05/22 职场文书
房屋转让协议书
2014/10/18 职场文书
2014年学生管理工作总结
2014/12/20 职场文书
涪陵白鹤梁导游词
2015/02/09 职场文书
搞笑婚前保证书
2015/02/28 职场文书
交通安全月活动总结
2015/05/08 职场文书
朋友聚会开场白
2015/06/01 职场文书
新闻简讯格式及范文
2015/07/22 职场文书