web通过转发进行视频聊天和直播的简单实现

简介: web通过转发进行视频聊天和直播的简单实现

纯属自己理解和搜刮来的实现 哈哈



web视频聊天的基本思路


1.借助浏览器获取摄像头信息

2.获取摄像头视频信息

3.得到视频信息后进行编码

4.服务器进行信息转发

5.客户端解码进行播放


web直播的基本思路



1.有了视频聊天,简单的直播那就是服务器端对客户端进行转发推送


遇到的问题


1.对于单纯的视频聊天1对1可以实现无卡顿操作直接对流进行拼接就可以的了,这里有个问题就是获取的视频信息段单独播放是失败的后续查找后说是缺少关键帧,我对这里的理解也是有限的,那么有了这个问题在直播的时候无法满足中途进来的用户。


2.解决了第一个问题通过一些其他的方式获取的帧都是独立可以播放的,但是在客户端接收数据后通过src切换加载有个问题那就是卡顿很明显的切换数据加载。


3.第二个问题解决办法在进行切src的时候进行获取当前播放的最后一个画面设置为下一个播放的预览图这个是目前我这里找到的办法,有其它方式可以给我留言。


实现


服务端:NETTY(websocket)

客户端浏览器、视频播放video.js

传输协议JSON


部分代码


1.视频1对1发送


try {
        var options = {mimeType: mimeType};
        mediaRecorder = new MediaRecorder(stream, options);
    } catch (e) {
        console.error('Exception while creating MediaRecorder: ' + e);
        log('Exception while creating MediaRecorder: ' + e);
        alert('Exception while creating MediaRecorder: '
            + e + '. mimeType: ' + options.mimeType);
        return;
    }
    //这里有个触发器每一秒钟会得到一个
    mediaRecorder.start(1000);
    //把获取到的数据可以转码为base64通过websocket推送到服务器进行转发
    mediaRecorder.ondataavailable = handleDataAvailable;
function handleDataAvailable(event) {
    if (event.data && event.data.size > 0) {
        console.log('正在发送数据...');
            var reader = new FileReader();
                reader.readAsDataURL(event.data);
                reader.onload = function (e) {
                    //console.info("videoStr:"+reader.result);
                    //发送给服务端进行转发
                    sendVideo(reader.result);
                    //window.URL.revokeObjectURL(localVideoPlayer.src);
                    }
            //socket.send(event.data);
    }
}    
复制代码


2.视频1对1接收


//接收数据
var index=0;
var successStream;
var oSourceBuffer, oMediaSource;
var mimeCodec='video/webm; codecs="vp8,opus"';
if ('MediaSource' in window &&                MediaSource.isTypeSupported(mimeCodec)) {
       console.log("oMediaSource");
       oMediaSource = new MediaSource();
       var url = URL.createObjectURL(oMediaSource);
       remoteVideoVid.src = url;
         oMediaSource.addEventListener('sourceopen', sourceOpen);
      } else {
        console.log("The Media Source Extensions API is not supported.")
      }
function sourceOpen () {
         console.log("oMediaSource2:"+this.readyState); // open
         oSourceBuffer = oMediaSource.addSourceBuffer(mimeCodec);
         oSourceBuffer.addEventListener('updateend', streamPlay);
};
function streamPlay(e) {
       remoteVideoVid.play();
}
//接收服务端推送过来的数据 这里只需要拼接就可以了
function remotStream(stream){
 if (oSourceBuffer) {
    oSourceBuffer.appendBuffer(dataURItoArray(stream));
 } else {
    console.log('no init sourceBuffer');
 }
}
复制代码


3.直播推送的处理发放


//这里通过定时任务进行推送,每次的数据都是一个可以播放的小模块
setInterval("stopSend()",1000);
function stopSend(){
   console.log("stop:"+sendIndex);
   if(mediaRecorder){
    mediaRecorder.stop();  
    mediaRecorder.start();
    console.log("testRequestData");
   }else{
    console.log("noStop:"+sendIndex);
   }
}
复制代码


4.直播接收的处理


remoteVideoPlayer2.on('ended',function(e) {
 console.log("ended2:"+videoStart+"_"+index);
 //在记载下一个视频块的时候背景采用上一个的画面,这样是卡顿不是太明显
 ctx.drawImage(remoteVideoVid2, 0, 0, 400, 300);
 let src=canvas.get()[0].toDataURL("image/jpeg");
 remoteVideoPlayer2.poster(src);
 //这里后续需要优化因为目前的地方是把接收到的数据缓存在了浏览器
 remoteVideoPlayer2.src(new_source.slice(index-1));
}
复制代码


5.服务器进行信息转发


//netty进行信息转发
ChannelManager.getChannel(message.getAccept().getUserCode())
.writeAndFlush(newTextWebSocketFrame(this.getMapper().
                                     writeValueAsString(message)));
复制代码


效果


网络异常,图片无法展示
|

相关文章
|
关系型数据库 MySQL 定位技术
Python web框架 之Django + Python3.7 + 集成百度地图【视频讲解】
python集成百度地图 介绍 python集成百度地图demo
629 0
Python web框架 之Django + Python3.7 + 集成百度地图【视频讲解】
|
27天前
|
存储 缓存 前端开发
Web端IM聊天消息该不该用浏览器本地存储?一文即懂!
鉴于目前浏览器技术的进步(主要是HTML5的普及),在Web网页端IM聊天应用的技术选型阶段,很多开发者都会纠结到底该不该像原生移动端IM那样将聊天记录缓存在浏览器的本地,还是像传统Web端即时通讯那样继续存储在服务端?本文将为你简洁明了地讲清楚浏览器本地存储技术(Web Storage),然后你就知道到底该怎么选择了。
29 1
|
2月前
|
机器学习/深度学习 数据处理 数据库
基于Django的深度学习视频分类Web系统
基于Django的深度学习视频分类Web系统
64 4
基于Django的深度学习视频分类Web系统
|
4月前
|
数据可视化 Python
通过python建立一个web服务查看服务器上的文本、图片、视频等文件
通过python建立一个web服务查看服务器上的文本、图片、视频等文件
80 0
|
6月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的高校疫情防控web系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的高校疫情防控web系统附带文章源码部署视频讲解等
38 0
|
7月前
|
前端开发 JavaScript
Web前端全栈工程师2023视频课程
该视频课程旨在为学习者提供全面的Web前端与全栈开发技能。学员将深入学习HTML、CSS、JavaScript、React、Node.js等内容,并通过实际项目实战经验,掌握现代Web开发所需的关键技能,助力他们成为全栈工程师。
69 0
|
7月前
|
前端开发 JavaScript 应用服务中间件
WEB前端有必要学会docker吗?0基础-45分钟带你学会(包含视频笔记案例源代码)
WEB前端有必要学会docker吗?0基础-45分钟带你学会(包含视频笔记案例源代码)
72 0
|
7月前
|
自然语言处理 算法 数据库
【JavaScript+自然语言处理+HTML+CSS】实现Web端的智能聊天问答客服实战(附源码 超详细必看)
【JavaScript+自然语言处理+HTML+CSS】实现Web端的智能聊天问答客服实战(附源码 超详细必看)
131 0
|
7月前
|
XML JavaScript 前端开发
【Web智能聊天客服】之JavaScript、jQuery、AJAX讲解及实例(超详细必看 附源码)
【Web智能聊天客服】之JavaScript、jQuery、AJAX讲解及实例(超详细必看 附源码)
99 0
|
7月前
|
移动开发 前端开发 HTML5
【Web端智能聊天客服】之HTML、CSS、Bootstrap的讲解及实例(超详细必看 附源码)
【Web端智能聊天客服】之HTML、CSS、Bootstrap的讲解及实例(超详细必看 附源码)
270 0