<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-1  評論-2  文章-0  trackbacks-0
      2011年5月19日

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

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

            這個問題比較簡單,所用到的類有:

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

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

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

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

            以上的幾個類說明及用法在  ActionScript 3.0 Language and Components Reference 這種參考文檔里都可以找到,這里就不介紹了。我這的需求當(dāng)中只需截圖轉(zhuǎn)換即可不需要第三個類來摻和。部分代碼如下:

     

    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)很清楚了,就不寫過多的費(fèi)話了。這一部分結(jié)束;

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

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

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

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

             但要記住,此方法會拋出異常  
           第三件事就是接收數(shù)據(jù),并進(jìn)行處理了,也就是在這里,可以是理解的不到位,繞了不小的彎子,不過最終還是繞回來了:
             在這是我要接收的的二進(jìn)制流,數(shù)據(jù)基本都是二制的,所以要用到 :DataInputStream,讓它來獲取socket對象的輸入流,相應(yīng)的DataOutputStream獲取socket對象的輸出流來完成對客戶端的響應(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("傳輸開始:");
    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是對接收過來的二進(jìn)制數(shù)據(jù)進(jìn)行轉(zhuǎn)換得到圖片各像素點(diǎn)的值,具體代碼就不貼了。
           主要考濾到Flex在處理圖片上進(jìn)行格式的轉(zhuǎn)換相當(dāng)?shù)穆綗o法忍受的地步,所以采用后臺Java來處理,從實(shí)驗(yàn)的結(jié)果上看對前臺不怎么影響,在一定程度上得到改善,希望有這方面經(jīng)驗(yàn)的人多指點(diǎn),提出寶貴的意見,
           這是我第一次寫B(tài)log,請多多支持
    posted @ 2011-05-19 10:53 The Conqueror 閱讀(2482) | 評論 (2)編輯 收藏
    僅列出標(biāo)題  
    主站蜘蛛池模板: 亚洲视频无码高清在线| 久久国产一片免费观看| 99视频精品全部免费观看| 又黄又爽又成人免费视频| 亚洲综合色丁香麻豆| 2015日韩永久免费视频播放| 久久精品a亚洲国产v高清不卡| 外国成人网在线观看免费视频| 99久久亚洲精品无码毛片| 97碰公开在线观看免费视频| 亚洲国产最大av| 国产在线19禁免费观看| 黄页网址在线免费观看| 亚洲熟妇无码八AV在线播放| 中文字幕乱码一区二区免费| 亚洲综合一区二区精品导航| 国产无人区码卡二卡三卡免费| 中文字幕乱码亚洲无线三区| 日本a级片免费看| 久久久久久久国产免费看| 久久久久亚洲av无码专区蜜芽| 亚洲视频免费在线播放| 亚洲熟妇AV日韩熟妇在线| 久久久久av无码免费网| 亚洲国产成人在线视频| 国产精品jizz在线观看免费| 一级一片免费视频播放| 在线观看亚洲人成网站| 日韩精品视频免费在线观看| 久久www免费人成精品香蕉| 久久久久亚洲av无码专区喷水 | 欧美三级在线电影免费| jzzijzzij在线观看亚洲熟妇| 亚洲美女在线国产| 95老司机免费福利| 国产偷国产偷亚洲清高APP| 国产成A人亚洲精V品无码| 成年女人免费v片| 中文字幕乱码系列免费| 在线亚洲午夜片AV大片| 日韩一卡2卡3卡4卡新区亚洲|