
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
2 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對象的輸出流來完成對客戶端的響應,代碼如下:
1
import java.awt.Image;
2
import java.awt.Toolkit;
3
import java.awt.image.BufferedImage;
4
import java.awt.image.MemoryImageSource;
5
import java.io.DataInputStream;
6
import java.io.DataOutputStream;
7
import java.io.File;
8
import java.io.FileOutputStream;
9
import java.io.DataInputStream;
10
import javax.imageio.ImageIO;
11
try {
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, 0, 0, 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 閱讀(2482) |
評論 (2) |
編輯 收藏