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制作翻转效果_动力节点Java学院整理
Jul 11 HTML / CSS
CSS3 Columns分列式布局方法简介
May 03 HTML / CSS
CSS3实现歌词进度文字颜色填充变化动态效果的思路详解
Jun 02 HTML / CSS
canvas粒子动画背景的实现示例
Sep 03 HTML / CSS
HTML5 实现一个访问本地文件的实例
Dec 13 HTML / CSS
利用html5的websocket实现websocket聊天室
Dec 12 HTML / CSS
HTML5实现预览本地图片
Feb 17 HTML / CSS
利用HTML5 Canvas API绘制矩形的超级攻略
Mar 21 HTML / CSS
html5需遵循的6个设计原则
Apr 27 HTML / CSS
canvas简易绘图的实现(海绵宝宝篇)
Jul 04 HTML / CSS
HTML5之消息通知的使用(Web Notification)
Oct 30 HTML / CSS
CSS list-style-type属性使用方法
May 21 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
php中mt_rand()随机数函数用法
2014/11/24 PHP
两种php去除二维数组的重复项方法
2015/11/04 PHP
PHP实现根据密码长度显示安全条
2017/07/04 PHP
自己实现string的substring方法 人民币小写转大写,数字反转,正则优化
2012/09/02 Javascript
jquery插件开发之实现md5插件
2014/03/17 Javascript
jQuery的框架介绍
2016/05/11 Javascript
js enter键激发事件实例代码
2016/08/17 Javascript
VueJS全面解析
2016/11/10 Javascript
Linux系统中利用node.js提取Word(doc/docx)及PDF文本的内容
2017/06/17 Javascript
详谈commonjs模块与es6模块的区别
2017/10/18 Javascript
三种Webpack打包方式(小结)
2018/09/19 Javascript
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
[02:32]“虐狗”镜头慎点 2016国际邀请赛中国区预选赛现场玩家采访
2016/06/28 DOTA
Python文件处理
2016/02/29 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
2016/10/09 Python
Python常用库推荐
2016/12/04 Python
详解python selenium 爬取网易云音乐歌单名
2019/03/28 Python
Python编写打字训练小程序
2019/09/26 Python
Pandas-Cookbook 时间戳处理方式
2019/12/07 Python
python 定义类时,实现内部方法的互相调用
2019/12/25 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
2020/04/17 Python
Python基于QQ邮箱实现SSL发送
2020/04/26 Python
日本整理专家Marie Kondo的官方在线商店:KonMari
2020/06/29 全球购物
办公室秘书岗位职责范本
2014/02/11 职场文书
学校元旦晚会方案
2014/02/19 职场文书
《鹬蚌相争》教学反思
2014/04/22 职场文书
党员民主生活会整改措施
2014/09/26 职场文书
解除劳动合同通知书范本
2015/04/16 职场文书
产品调价通知函
2015/04/20 职场文书
2015年煤矿安全工作总结
2015/05/23 职场文书
环保建议书作文500字
2015/09/14 职场文书
2019自荐信范文集锦!
2019/07/03 职场文书
z-index不起作用
2021/03/31 HTML / CSS
聊聊Python中关于a=[[]]*3的反思
2021/06/02 Python
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android
关于windows server 2012 DC 环境 重启后蓝屏代码:0xc00002e2的问题
2022/05/25 Servers