將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
2 private static ServerSocket server;
3 server = new ServerSocket(1024);
聲明服務 ,設置端口號,要注意端口號必需大于等于1024,小于1024的都名花有主了,
第二個要做的就是監聽了,也就是接收前臺發送過來的數據,也可以將Flex前臺理解為客戶端,Java這邊建立服務,可以稱為服務器端,這樣更易理解些。使用ServerSocket類的一個方法 accept,此方法在未接收到數據時是阻塞的:
2 private Socket socket;
3 socket = server.accept();
但要記住,此方法會拋出異常

第三件事就是接收數據,并進行處理了,也就是在這里,可以是理解的不到位,繞了不小的彎子,不過最終還是繞回來了:
在這是我要接收的的二進制流,數據基本都是二制的,所以要用到 :DataInputStream,讓它來獲取socket對象的輸入流,相應的DataOutputStream獲取socket對象的輸出流來完成對客戶端的響應,代碼如下:

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

45

46

47

48

49

主要考濾到Flex在處理圖片上進行格式的轉換相當的慢,到無法忍受的地步,所以采用后臺Java來處理,從實驗的結果上看對前臺不怎么影響,在一定程度上得到改善,希望有這方面經驗的人多指點,提出寶貴的意見,

這是我第一次寫Blog,請多多支持
