
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
2 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),代碼如下:
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
} 上面就是接收數(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) |
編輯 收藏