×

基于虚拟通道的Flash映射技术解析

消耗积分:1 | 格式:rar | 大小:0.8 MB | 2017-12-05

分享资料个

虚拟化领域的一个技术热点是桌面PC的虚拟化,即虚拟桌面架构(VDI)。虚拟桌面架构解决方案正在帮助企业将其Windows桌面和数据转变成类似云的资源,最终用户能够在任何设备上随时随地访问这些资源。
  然而,最终用户都希望虚拟桌面的性能和用户体验至少和物理桌面一样好,但是对于某些应用——如视频播放、网页Flash播放等等——VDI的用户体验均不理想。本文针对VDI环境下网页Flash视频播放效果差的问题,提出了一种基于虚拟通道的Flash映射技术,大幅度提升了在VDI环境下播放网页Flash视频的效果,提高了VDI环境下的用户体验。
  一、虚拟化环境
  虚拟化是一个表现逻辑群组或电脑资源的子集的进程,用户可以用比原本的组态更好的方式来存取这些进程。这些资源的新虚拟部份是不受现有资源的架设方式、地域或物理组态所限制。虚拟化技术和云计算平台的结合带来了全新的资源整合和使用模式,基于虚拟化技术的资源按需分配与调度可以提高云平台资源的利用率,提升云服务的服务质,并降低云用户的总体拥有成本。
  虚拟桌面架构解决方案正在帮助企业将其Windows桌面和数据转变成类似云的资源,最终用户能够在任何设备上随时随地访问这些资源。虽然VDI承诺的数据安全性和更高的资源利用率推动了特定市场中的初期采用,但是它并没有被整个企业界广泛采用。这是因为传统VDI的用户体验大大低于本地PC可提供的用户体验。尤其是在视频观看和Flash播放等富媒体内容时,VDI的用户体验更是不可接受的。
  二、Flash映射技术
  目前,对于在VDI环境下视频播放已经有了比较成熟的重定向技术。但是对于网页Flash播放却一直没有很好的解决方法。其原因无非有以下几点:
  1.服务端源数据获取困难
  视频重定向技术是通过使用特殊的分离器和解码器实现对源数据的获取,因此只要视频播放器能够加载该分离器和解码器即可获取视频源数据。然而,网页中的Flash播放器是不会加载任何第三方解码器的,这就造成了几乎无法获取视频源数据。
  2.客户端源数据获取困难
  在多数VDI环境下,客户端设备的网络环境是受限的;也就是说,在这种环境下,运行于客户端设备的软件无法任意地访问位于互联网的资源,如视频、音频等。而网页上Flash视频均保存在互联网上,这就造成了此类客户端无法获取视频源数据。
  3.用户操控无法获取
  在视频重定向技术中,当用户对视频进行播放、暂停、停止等等操作时,分离器和解码器会收到通知。然而在Flash视频中,没有任何方法能够获取用户所进行的操作。
  为了解决以上问题,目前存在一种“Flash增强技术”。该技术通过在服务器端截取Flash视频的绘图事件,将Flash视频绘制到屏幕上的数据进行二次编码,然后再将二次编码过的数据发送到客户端进行播放。这种方法可以在一定程度上解决这些问题,但同时又带来了其它问题,如服务器和客户端资源占用过高,带宽占用也较大,这就对服务器和客户端的硬件增加了要求。
  但以上几点并不能说明Flash重定向是不可行的。Flash视频是通过网页上的Flash元素进行播放的,而一个Flash元素会对应一个Flash文件。通过将网页上的Flash文件重定向到客户端本地,理论上可以达到重定向Flash视频的效果。基于虚拟通道的Flash映射技术实现方法如下:
  (1)在服务端编写浏览器插件,用于获取播放Flash视频的Flash文件的URL;
  (2)将Flash文件URL发送至客户端,客户端创建一个简单的浏览器,使用相同的参数加载该文件。
  理论上讲,至此就可以实现Flash文件的重定向。由于是将Flash文件重定向至客户端,所以也就不存在无法获取视频源的问题,因为视频源的获取将由客户端的浏览器完成。同时,在客户端呈现的就是Flash视频播放器界面,用户将直接对客户端本地的Flash播放器进行如播放、暂停等等操作,因此也就不存在用户操作的问题了。
  最后一个问题,即前面所述的网络受限问题,到目前为止还没有解决。如果客户端网络受限,那么运行在客户端上的浏览器将无法直接访问互联网,也就无法加载Flash文件。但此时,服务端的网络是不受限的;也就是说,运行于服务端的软件可以任意地访问位于互联网的资源。据此,使用一种基于虚拟通道的网络代理方法,即可解决上述问题。
  基于虚拟通道的网络代理方法,在服务端搭建服务端用基于虚拟通道的特殊代理服务器(即“服务端代理”),当用户远程登录到服务端时启动,并建立一条特殊代理服务器专用虚拟通道(即“专用虚拟通道”);在客户端运行一个客户端用基于虚拟通道的特殊代理服务器(即“客户端代理”),负责代理客户端中软件的网络请求;其它客户端软件(即“客户端软件”)在访问互联网资源时,将客户端代理设置为其代理服务器,并通过客户端代理发送网络请求;客户端代理接收到来自其它运行于客户端软件的网络代理请求后,将该请求通过专用虚拟通道发送到服务端代理处;服务端代理从专用虚拟通道接收来自客户端代理的代理请求后,将该请求发向互联网,并接收来自互联网的响应;服务端代理接收到来自互联网的响应后,将该响应通过专用虚拟通道发送到客户端代理处;客户端代理接收到来自专用虚拟通道的响应后,将响应发送到客户端软件,完成一次代理过程。
  如此,客户端可以通过特殊代理从服务器接收的原始压缩多媒体流,并在本地解码显示。这将减少带宽的使用,因为在网络上传输的数据是被压缩的视频,而不是一系列未压缩的位图。此时带宽占用将与从视频服务器播放流内容或者通过文件共享方式播放服务器上的视频类似。另外,无论播放视频的窗口大小如何,甚至是全屏播放,带宽的占用率都将保持不变。
  这种方法还可以节省服务器资源,服务器不再花费CPU资源解码视频内容并进行二次编码,视频解码全由客户端负责。即使是在客户端上渲染,视频显示在屏幕上的内容也将是无缝的。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'基于虚拟通道的Flash映射技术解析',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);