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 相关文章推荐
css3动画过渡实现鼠标跟随导航效果
Feb 08 HTML / CSS
利用CSS3参考手册和CSS3代码生成工具加速来学习网页制
Jul 11 HTML / CSS
全方位了解CSS3的Regions扩展
Aug 07 HTML / CSS
CSS3实现千变万化的文字阴影text-shadow效果设计
Apr 26 HTML / CSS
详解CSS3原生支持div铺满浏览器的方法
Aug 30 HTML / CSS
10分钟理解CSS3 Grid布局
Dec 20 HTML / CSS
从一次项目重构说起CSS3自定义变量在项目的使用方法
Mar 01 HTML / CSS
使用javascript和HTML5 Canvas画的四渐变色播放按钮效果
Apr 10 HTML / CSS
HTML5所有标签汇总及标签意义解释
Mar 12 HTML / CSS
phonegap常用事件总结(必看篇)
Mar 31 HTML / CSS
Html5之webcoekt播放JPEG图片流
Sep 22 HTML / CSS
详解盒子端CSS动画性能提升
May 24 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
BBS(php &amp; mysql)完整版(一)
2006/10/09 PHP
关于mysql 字段的那个点为是定界符
2007/01/15 PHP
php mssql 时间格式问题
2009/01/13 PHP
php URL验证正则表达式
2011/07/19 PHP
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
2016/05/18 PHP
PHP实现统计代码行数小工具
2019/09/19 PHP
IE8 浏览器Cookie的处理
2009/01/31 Javascript
jquery 最简单易用的表单验证插件
2010/02/27 Javascript
javascript日期对象格式化为字符串的实现方法
2014/01/14 Javascript
a标签click和href执行顺序探讨
2014/06/23 Javascript
用原生js做个简单的滑动效果的回到顶部
2014/10/15 Javascript
JavaScript实现删除,移动和复制文件的方法
2015/08/05 Javascript
Sort()函数的多种用法
2016/03/20 Javascript
jQuery通用的全局遍历方法$.each()用法实例
2016/07/04 Javascript
bootstrapValidator.min.js表单验证插件
2017/02/09 Javascript
node.js + socket.io 实现点对点随机匹配聊天
2017/06/30 Javascript
vue引入swiper插件的使用实例
2017/07/19 Javascript
js时间戳与日期格式之间转换详解
2017/12/11 Javascript
vue项目国际化vue-i18n的安装使用教程
2018/03/14 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
2019/06/20 Javascript
elementUi vue el-radio 监听选中变化的实例代码
2019/06/28 Javascript
简单了解JavaScript作用域
2020/07/31 Javascript
Python合并字符串的3种方法
2015/05/21 Python
基于python代码实现简易滤除数字的方法
2018/07/17 Python
Python 3.x基于Xml数据的Http请求方法
2018/12/28 Python
详解Python是如何实现issubclass的
2019/07/24 Python
Python缓存技术实现过程详解
2019/09/25 Python
python中的RSA加密与解密实例解析
2019/11/18 Python
python实现批量修改文件名
2020/03/23 Python
印度在线购买电子产品网站:Croma
2020/01/02 全球购物
TCP/IP中的TCP和IP分别承担什么责任
2012/04/21 面试题
师范生教师实习自我鉴定
2013/09/27 职场文书
大学生职业生涯规划书模板
2014/01/18 职场文书
南极大冒险观后感
2015/06/05 职场文书
python非标准时间的转换
2021/07/25 Python
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
2021/09/25 Java/Android