加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Flash 屏幕共享技术

发布时间:2020-12-15 07:08:59 所属栏目:百科 来源:网络整理
导读:Flash屏幕共享技术 ?所谓屏幕共享就是将一台电脑的屏幕图像通过网络共享到其他多台电脑上。让其他电脑可以看到和这台电脑一样的桌面,并可以远程鼠标键盘操作。 屏幕共享技术分三部分: 屏幕编辑器,网络传输,屏幕接收解码 。 ?屏幕编码器实现屏幕图像采集

Flash屏幕共享技术

?所谓屏幕共享就是将一台电脑的屏幕图像通过网络共享到其他多台电脑上。让其他电脑可以看到和这台电脑一样的桌面,并可以远程鼠标键盘操作。

屏幕共享技术分三部分:屏幕编辑器,网络传输,屏幕接收解码
?屏幕编码器实现屏幕图像采集和编码。有两种途径:一,屏幕单独的屏幕编码器。二,通过虚拟摄像头+Flash编码。第一种方式可以实现更复杂的编码。第二种方式相对简单。但是只能采用Flash的视频编码,缺点是压缩效率很低,占用CPU大,带宽大。对于屏幕上的文字来说这种压缩效果不太理想。所以本文主要讲第一种编码方式。

屏幕编码器实现方案
?抓取屏幕图像,只提取屏幕变化区域,这样屏幕不变化的时候就不传输数据。通过zlib或Jpeg压缩(要想压缩得更小,那就得对屏幕区域进行分块和索引)。将压缩后的数据发送给Flash Player。这一步对于属性图像编程的人来说还算比较容易实现,只是算法效率问题。

最关键的问题是Flash 接收和显示远程桌面的图像
?as3的ByteArray和Socket使得Flash 可以开发自己的屏幕图像解码器。网上有一个开源Flashlight-VNC,实现了用Flash 接收VNC远程桌面。代码比较复杂,我在这里做一个简化。

以下代码示例如何通过As3的Socket连接到服务器,并接收数据,解压缩成位图。

import flash.events.*;
import flash.net.Socket;
import flash.system.JPEGLoaderContext;
import flash.utils.ByteArray;

var sip:String="127.0.0.1"; //服务器IP
var port:int=9669; //服务器端口

//定义Socket和相关事件。
var socket:Socket;
socket = new Socket(?? );
socket.addEventListener( Event.CONNECT,onConnect );
socket.addEventListener( ProgressEvent.SOCKET_DATA,onSocketData );
socket.addEventListener(Event.CLOSE,onSocketClose);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onSocketSecurityError);
socket.addEventListener(IOErrorEvent.IO_ERROR,onSocketError);
//连接服务器进行安全认证。
Security.loadPolicyFile("xmlsocket://"+sip+":"+port);
//连接服务器获取屏幕数据。
socket.connect(sip,port );

function onConnect( event:Event ):void {
?? trace( "The socket is now connected..." );
?//连接成功,这里可以发送数据了。这里我把IP发送出去吧。
? var myArray:ByteArray=new ByteArray();
?? myArray.writeUTFBytes(sip);
?? socket.writeBytes(myArray);
}
function onSocketData( eventrogressEvent ):void {
??
?//有数据了,接收,解码吧。
?? while(socket.bytesAvailable)
?{
??var myArray:ByteArray=new ByteArray();
??socket.readBytes(myArray,socket.bytesAvailable);
??//...显示解码接收到的数据,具体该接收多长的数据自己决定。
??//如果是zlib编码,可以直接用 bmpArry.uncompress();函数来接压缩。
??if(bzlib)
??{
???bmpArry.uncompress();
???将解压后的数据填充到位图里面。
???var rc:Rectangle=new Rectangle(0,cx,cy);
???var bmpD:BitmapDat = new BitmapData(cx,cy,true);
???bmpD.setPixels(rc,bmpArry);
??}
??//如果是jpeg编码,可以通过jpegload来解压。
??if(bjpeg)
??{
??var jpegLoaderContext:LoaderContext = new JPEGLoaderContext(0,false,loaderInfo.applicationDomain,null);
??var loader:Loader = new Loader();
??loader.loadBytes(jpgArry,jpegLoaderContext);
??loader.contentLoaderInfo.addEventListener(Event.INIT,function(event:Event):void {
????var jpegImage:Bitmap = loader.content as Bitmap;
????//这个就是要显示的位图了,放在适当的位置显示吧。
???});
??}
?????? }
}
function onSocketClose(event:Event):void {
??trace("Connection close");
??}
function onSocketError(event:IOErrorEvent):void {
??trace("Socket连接失败: " + event.type+","+event.text);
??}
??
function onSocketSecurityError(event:SecurityErrorEvent):void {
???trace("An security error occured ("+event.text+").n" +
????"Check your policy-policy server configuration or disable security for this domain.",null);
??}

NN软件实现了一个功能复杂,可以多人同时接收,并支持远程鼠标键盘控制的屏幕共享组件。压缩效率比VNC高。

共享端安装一个插件。启动共享,可选择全屏或窗口或应用程序共享。可配置颜色,帧率。

演示地址:
http://www.enen6.com/ScreenShare.htm

Flash 接收端效果图:

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读