视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
采用HTML5+SignalR2.0(.Net)实现原生Web视频的代码分享
2020-11-27 15:10:40 责编:小采
文档

目录

对SignalR不了解的人可以直接移步下面的目录

SignalR系列目录

前言

- -,我又来了,今天废话不多说,我们直接来实现Web视频聊天.

采用的技术如下:

HTML5 WebRTC

SignalR2.2.0

localResizeIMG3(前端图像压缩技术,开源)

效果如图(马赛克你懂的,Demo效果比较简陋):

正文

首先我们来看看前端的实现,主要是通过HTML5的WebRTC技术获取视频流 转换成图片 然后采用压缩后定时发送的技术给到SignalR服务端.

我们先来看看获取视频流的JS,文字我就不多解释了,大家直接看注释即可

 
 canvas = document.getElementById("canvas"), 
 context = canvas.getContext("2d"), 
 video = document.getElementById("video"),
 videoObj = { "video": }, 
 errBack = "Video capture error: "
 
 (navigator.getUserMedia) { 
 navigator.getUserMedia(videoObj, = (navigator.webkitGetUserMedia) { 
 navigator.webkitGetUserMedia(videoObj, = data = (navigator.mozGetUserMedia) { 
 navigator.mozGetUserMedia(videoObj, =
 window.setInterval(0, 0, 320, 240 type = 'jpg' imgData =0.1, 
 done: data =
 500)

这样,我们就获取到了相关的数据(PS:获取到的图像大小约为4800个长度的字符串,压缩率0.1压缩后为2300个长度,自行根据带宽修改压缩率)

下面我们看看SignalR的实现代码(关键方法已经标黄):

 [HubName("getMessage")] public class TestHub : Hub
 { public void SendMessage(string aaaa)
 {
 Clients.All.broadcastMessage(aaaa);
 } public void SendImage(string imagedata)
 { //获取图像数据,转发给其他客户端
 Clients.Others.showimage(new {id=Context.ConnectionId,data=imagedata});
 } public override System.Threading.Tasks.Task OnConnected()
 {
 Clients.Others.addKuang(Context.ConnectionId); 
 return base.OnConnected();
 } public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
 {
 Clients.All.romeKuang(Context.ConnectionId); 
 return base.OnDisconnected(stopCalled);
 }
 }

我们来看看前端的SignalR的实现代码:

 // 这里是注册集线器调用的方法,和1.0不同的是需要chat.client后注册,1.0则不需要
 var chat = $.connection.getMessage;
 chat.client.broadcastMessage = function (name) { 
 // HTML编码的显示名称和消息。
 var encodedMsg = $('<p />').text(name).html(); 
 // 将消息添加到该页。
 $('#messsagebox').append('<li>' + encodedMsg + '</li>');
 }; 
 //获取图片数据,并实时显示
 chat.client.showimage = function (data) { 
 if ($("#" + data.id).length<=0) { 
 var html = '<p style="float: left; border: double" id="p' + data.id + '">\
 <img id="'+ data.id + '" width="320" height="240">\
 <br />\
 <span>用户'+ data.id + '</span>\
 </p>'
 $("#contextp").append(html)
 }
 $("#" + data.id).attr("src", data.data);
 } // 获取用户名称。
 $('#username').html(prompt('请输入您的名称:', '')); 
 // 设置初始焦点到消息输入框。
 $('#message').focus(); 
 // 启动连接,这里和1.0也有区别
 $.connection.hub.start().done(function () {
 $('#send').click(function () { 
 var message = $('#username').html() + ":" + $('#message').val() 
 // 这里是调用服务器的方法,同样,首字母小写 
 chat.server.sendMessage(message); // 清空输入框的文字并给焦点.
 $('#message').val('').focus();
 });
 });

这样,我们很简单的就完成了HTML5+SignalR2.0的视频聊天程序.

写在最后

由于这是一个简单的Demo,所以并没有考虑到应用于生产环境的问题,文章中实现的是视频群聊,所以对带宽要求很高(毕竟数据全部需要从服务器交换出去,基本测试为4人需要2M带宽,在压缩率0.1的情况下),如果你要应用于生产环境,还是需要进一步的优化,比如通信的间隔,最好是单人互相通信之类的各种情况...,就说到这里,Over..

下载本文
显示全文
专题