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 相关文章推荐
CSS中一些@规则的用法小结
Mar 09 HTML / CSS
前端制作动画的几种方式(css3,js)
Dec 12 HTML / CSS
全面解析CSS Media媒体查询使用操作(推荐)
Aug 15 HTML / CSS
绝对令人的惊叹的CSS3折叠效果(3D效果)整理
Dec 30 HTML / CSS
HTML5 Plus 实现手机APP拍照或相册选择图片上传功能
Jul 13 HTML / CSS
HTML5标签小集
Aug 02 HTML / CSS
Html5实现iPhone开机界面示例代码
Jun 30 HTML / CSS
html5画布旋转效果示例
Jan 27 HTML / CSS
HTML5 Canvas 绘图——使用 Canvas 绘制图形图文教程 使用html5 canvas 绘制精美的图
Aug 31 HTML / CSS
关于老式浏览器兼容HTML5和CSS3的问题
Jun 01 HTML / CSS
微信html5页面调用第三方位置导航的示例
Mar 14 HTML / CSS
HTML5中的websocket实现直播功能
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
使用MaxMind 根据IP地址对访问者定位
2006/10/09 PHP
PHP引用符&amp;的用法详细解析
2013/08/22 PHP
WordPress导航菜单的滚动和淡入淡出效果的实现要点
2015/12/14 PHP
Symfony2创建页面实例详解
2016/03/18 PHP
php.ini中date.timezone设置详解
2016/11/20 PHP
PHP7实现和CryptoJS的AES加密方式互通示例【AES-128-ECB加密】
2019/06/08 PHP
jquery 应用代码 方便的排序功能
2010/02/06 Javascript
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
javascript引用类型指针的工作方式
2015/04/13 Javascript
简介JavaScript中getUTCMonth()方法的使用
2015/06/10 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
2015/06/25 Javascript
基于JavaScript实现弹出框效果
2016/02/19 Javascript
javascript创建对象的几种模式介绍
2016/05/06 Javascript
折叠菜单及选择器的运用
2017/02/03 Javascript
Jquery和CSS实现选择框重置按钮功能
2018/11/08 jQuery
VUE实现移动端列表筛选功能
2019/08/23 Javascript
python列表操作之extend和append的区别实例分析
2015/07/28 Python
python脚本实现xls(xlsx)转成csv
2016/04/10 Python
python脚本替换指定行实现步骤
2017/07/11 Python
python实现二分查找算法
2017/09/21 Python
django使用xlwt导出excel文件实例代码
2018/02/06 Python
python使用多进程的实例详解
2018/09/19 Python
python模糊图片过滤的方法
2018/12/14 Python
Python编程深度学习计算库之numpy
2018/12/28 Python
python遍历小写英文字母的方法
2019/01/02 Python
Pytorch中的variable, tensor与numpy相互转化的方法
2019/10/10 Python
使用PyOpenGL绘制三维坐标系实例
2019/12/24 Python
关于Tensorflow使用CPU报错的解决方式
2020/02/05 Python
python烟花效果的代码实例
2020/02/25 Python
纯CSS3实现8组超炫酷鼠标滑过图片动画
2016/03/16 HTML / CSS
深入了解canvas在移动端绘制模糊的问题解决
2019/04/30 HTML / CSS
期末学生评语大全
2014/04/24 职场文书
城管综合整治方案
2014/05/01 职场文书
社区优秀志愿者先进事迹
2014/05/09 职场文书
技能比武方案
2014/05/21 职场文书
清明节扫墓活动总结
2015/02/09 职场文书