随笔-1  评论-2  文章-0  trackbacks-0
  2011年5月19日

        将Flex中的信息通过Socket,由Java来接受并进行处理可以大大的降低Flex的前台的处理,这是我最近一周来做的事,被这些小事给缠住了,可这些小问题又不得不解决,对于我这个初学者来说还是比较辛苦的,当然对于牛人来说这就是小儿科了,就当看笑话吧,对于新手或有这方面需求的人来说,可以借鉴一下。下面入正题:
        我所实现的是在Flex前台中对Camera或播放的视频流进行截图,将其转换为二进制流,通过Socket,将二进制流发送给后台的Java,实现对图片的保存,起初我也觉得挺简单的,不想一做就做了老长的时间,真是特郁闷

      1.Flex实现截图的功能

        这个问题比较简单,所用到的类有:

            public class BitmapData :想了很多方法,这个类都用上了(可能我思维局限吧,!)

            public class ByteArray   :将图象数据转换为字节流,此类也必不可少

            使用以上两类完全可以实现对视频流的截图以及转换,不过Flex还提供了一个类可以实再这样的功能:

          public dynamic class ImageSnapshot :看名字就知道是实现什么的了

        以上的几个类说明及用法在  ActionScript 3.0 Language and Components Reference 这种参考文档里都可以找到,这里就不介绍了。我这的需求当中只需截图转换即可不需要第三个类来掺和。部分代码如下:

 

1     var byteArray:ByteArray=new ByteArray();
2     var bitmap:BitmapData=new BitmapData(vd.width,vd.height);
3     bitmap.draw(vd);
4     byteArray.writeInt(bitmap.width);
5     byteArray.writeInt(bitmap.height);
6     var byteArrayTemp:ByteArray=bitmap.getPixels(bitmap.rect);
7     byteArray.writeBytes(byteArrayTemp);

 

        其中vd是要截取的视频流,代码已经很清楚了,就不写过多的费话了。这一部分结束;

        2.Flex中Socket的实现
         Socket 类使代码可以建立套接字连接并读取和写入原始二进制数据。这里所做的只是对主机地址及端口号进行设置,并对其进行监听,连接成功就可以发送数据了,这个的实再也是相当的简单,网上的资料也非常的多,具体的实再并不难找,在这就不过多的说了,跳过此节;
        3.Java中的实现
          在Java中所要做的事有:建立服务(设置端口号),接收数据,并对数据进行处理(生成相应的格式,在这里我只生成JPG的,其它道理相同)
 这里做一下简要的介绍:
          第一个介绍的当然是服务的建立:java.net.ServerSocket         

1   import  java.net.ServerSocket
 private static ServerSocket server;
3  server = new ServerSocket(1024);

          声明服务 ,设置端口号,要注意端口号必需大于等于1024,小于1024的都名花有主了,
        第二个要做的就是监听了,也就是接收前台发送过来的数据,也可以将Flex前台理解为客户端,Java这边建立服务,可以称为服务器端,这样更易理解些。使用ServerSocket类的一个方法 accept,此方法在未接收到数据时是阻塞的:

1  import java.net.Socket;
2  private Socket socket;
3  socket = server.accept();

         但要记住,此方法会抛出异常  
       第三件事就是接收数据,并进行处理了,也就是在这里,可以是理解的不到位,绕了不小的弯子,不过最终还是绕回来了:
         在这是我要接收的的二进制流,数据基本都是二制的,所以要用到 :DataInputStream,让它来获取socket对象的输入流,相应的DataOutputStream获取socket对象的输出流来完成对客户端的响应,代码如下:
 1import java.awt.Image;
 2import java.awt.Toolkit;
 3import java.awt.image.BufferedImage;
 4import java.awt.image.MemoryImageSource;
 5import java.io.DataInputStream;
 6import java.io.DataOutputStream;
 7import java.io.File;
 8import java.io.FileOutputStream;
 9import java.io.DataInputStream;
10import javax.imageio.ImageIO;

11try {
12            System.out.println("传输开始:");
13            file = new File("C:\\images\\image" + sum + ".jpg");
14            sum++;
15            DataInputStream dis = new DataInputStream(socket.getInputStream());
16            DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
17            
18            FileOutputStream out = new FileOutputStream(file);             
19            int width = dis.readInt();
20            int height = dis.readInt();
21            System.out.println("width:" + width+"--> height:"+height);
22            byte[] buffer1 = new byte[MAX_COUNT];
23            int size=width*4*height;
24            byte[] buffer=new byte[size];
25            int count=0,num=0;
26            while(true){
27                count=dis.read(buffer1,0,MAX_COUNT);
28                System.arraycopy(buffer1, 0, buffer, num, count);
29                num+=count;
30                System.out.println("length:" +num+"-->"+count);
31                if (num==size) {
32                    Image TheImage = readImage32(buffer, height, width);
33                    BufferedImage tag = new BufferedImage(width, height,
34                            BufferedImage.TYPE_INT_RGB);
35                    tag.getGraphics().drawImage(TheImage, 00, width, height, null);
36                    System.out.println(file.getName());
37//                    JPEGImageEncoder jpegImage = JPEGCodec.createJPEGEncoder(out);
38//                    jpegImage.encode(tag);
39                    ImageIO.write(tag, "JPEG", out);
40                    System.out.println("传输完成:");
41                    out.close();
42                    dis.close();
43                   }

45            }

46            
47        }
 catch (Exception e) {
48             e.printStackTrace();
49        }
      上面就是接收数据处理的大部分代码,就不做解释了,其中的readImage32是对接收过来的二进制数据进行转换得到图片各像素点的值,具体代码就不贴了。
       主要考滤到Flex在处理图片上进行格式的转换相当的慢,到无法忍受的地步,所以采用后台Java来处理,从实验的结果上看对前台不怎么影响,在一定程度上得到改善,希望有这方面经验的人多指点,提出宝贵的意见,
       这是我第一次写Blog,请多多支持
posted @ 2011-05-19 10:53 The Conqueror 阅读(2478) | 评论 (2)编辑 收藏
仅列出标题