隨筆-1  評(píng)論-2  文章-0  trackbacks-0
            2011年5月19日

                  將Flex中的信息通過(guò)Socket,由Java來(lái)接受并進(jìn)行處理可以大大的降低Flex的前臺(tái)的處理,這是我最近一周來(lái)做的事,被這些小事給纏住了,可這些小問(wèn)題又不得不解決,對(duì)于我這個(gè)初學(xué)者來(lái)說(shuō)還是比較辛苦的,當(dāng)然對(duì)于牛人來(lái)說(shuō)這就是小兒科了,就當(dāng)看笑話吧,對(duì)于新手或有這方面需求的人來(lái)說(shuō),可以借鑒一下。下面入正題:
                  我所實(shí)現(xiàn)的是在Flex前臺(tái)中對(duì)Camera或播放的視頻流進(jìn)行截圖,將其轉(zhuǎn)換為二進(jìn)制流,通過(guò)Socket,將二進(jìn)制流發(fā)送給后臺(tái)的Java,實(shí)現(xiàn)對(duì)圖片的保存,起初我也覺(jué)得挺簡(jiǎn)單的,不想一做就做了老長(zhǎng)的時(shí)間,真是特郁悶

                1.Flex實(shí)現(xiàn)截圖的功能

                  這個(gè)問(wèn)題比較簡(jiǎn)單,所用到的類有:

                      public class BitmapData :想了很多方法,這個(gè)類都用上了(可能我思維局限吧,!)

                      public class ByteArray   :將圖象數(shù)據(jù)轉(zhuǎn)換為字節(jié)流,此類也必不可少

                      使用以上兩類完全可以實(shí)現(xiàn)對(duì)視頻流的截圖以及轉(zhuǎn)換,不過(guò)Flex還提供了一個(gè)類可以實(shí)再這樣的功能:

                    public dynamic class ImageSnapshot :看名字就知道是實(shí)現(xiàn)什么的了

                  以上的幾個(gè)類說(shuō)明及用法在  ActionScript 3.0 Language and Components Reference 這種參考文檔里都可以找到,這里就不介紹了。我這的需求當(dāng)中只需截圖轉(zhuǎn)換即可不需要第三個(gè)類來(lái)?yè)胶汀2糠执a如下:

           

          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是要截取的視頻流,代碼已經(jīng)很清楚了,就不寫過(guò)多的費(fèi)話了。這一部分結(jié)束;

                  2.Flex中Socket的實(shí)現(xiàn)
                   Socket 類使代碼可以建立套接字連接并讀取和寫入原始二進(jìn)制數(shù)據(jù)。這里所做的只是對(duì)主機(jī)地址及端口號(hào)進(jìn)行設(shè)置,并對(duì)其進(jìn)行監(jiān)聽(tīng),連接成功就可以發(fā)送數(shù)據(jù)了,這個(gè)的實(shí)再也是相當(dāng)?shù)暮?jiǎn)單,網(wǎng)上的資料也非常的多,具體的實(shí)再并不難找,在這就不過(guò)多的說(shuō)了,跳過(guò)此節(jié);
                  3.Java中的實(shí)現(xiàn)
                    在Java中所要做的事有:建立服務(wù)(設(shè)置端口號(hào)),接收數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行處理(生成相應(yīng)的格式,在這里我只生成JPG的,其它道理相同)
           這里做一下簡(jiǎn)要的介紹:
                    第一個(gè)介紹的當(dāng)然是服務(wù)的建立:java.net.ServerSocket         

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

                    聲明服務(wù) ,設(shè)置端口號(hào),要注意端口號(hào)必需大于等于1024,小于1024的都名花有主了,
                  第二個(gè)要做的就是監(jiān)聽(tīng)了,也就是接收前臺(tái)發(fā)送過(guò)來(lái)的數(shù)據(jù),也可以將Flex前臺(tái)理解為客戶端,Java這邊建立服務(wù),可以稱為服務(wù)器端,這樣更易理解些。使用ServerSocket類的一個(gè)方法 accept,此方法在未接收到數(shù)據(jù)時(shí)是阻塞的:

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

                   但要記住,此方法會(huì)拋出異常  
                 第三件事就是接收數(shù)據(jù),并進(jìn)行處理了,也就是在這里,可以是理解的不到位,繞了不小的彎子,不過(guò)最終還是繞回來(lái)了:
                   在這是我要接收的的二進(jìn)制流,數(shù)據(jù)基本都是二制的,所以要用到 :DataInputStream,讓它來(lái)獲取socket對(duì)象的輸入流,相應(yīng)的DataOutputStream獲取socket對(duì)象的輸出流來(lái)完成對(duì)客戶端的響應(yīng),代碼如下:
           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("傳輸開(kāi)始:");
          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        }
                上面就是接收數(shù)據(jù)處理的大部分代碼,就不做解釋了,其中的readImage32是對(duì)接收過(guò)來(lái)的二進(jìn)制數(shù)據(jù)進(jìn)行轉(zhuǎn)換得到圖片各像素點(diǎn)的值,具體代碼就不貼了。
                 主要考濾到Flex在處理圖片上進(jìn)行格式的轉(zhuǎn)換相當(dāng)?shù)穆綗o(wú)法忍受的地步,所以采用后臺(tái)Java來(lái)處理,從實(shí)驗(yàn)的結(jié)果上看對(duì)前臺(tái)不怎么影響,在一定程度上得到改善,希望有這方面經(jīng)驗(yàn)的人多指點(diǎn),提出寶貴的意見(jiàn),
                 這是我第一次寫B(tài)log,請(qǐng)多多支持
          posted @ 2011-05-19 10:53 The Conqueror 閱讀(2482) | 評(píng)論 (2)編輯 收藏
          僅列出標(biāo)題  
          主站蜘蛛池模板: 平原县| 额尔古纳市| 高青县| 饶阳县| 大兴区| 日喀则市| 纳雍县| 青铜峡市| 改则县| 株洲县| 隆安县| 镇雄县| 蛟河市| 永平县| 洛隆县| 红河县| 达州市| 勐海县| 东阿县| 高邮市| 四子王旗| 乡宁县| 前郭尔| 泸定县| 郯城县| 临安市| 青河县| 资源县| 台湾省| 仁怀市| 遵化市| 丹巴县| 大港区| 柳州市| 金塔县| 赤城县| 孙吴县| 巴东县| 渝中区| 铜川市| 文山县|