將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)單,所用到的類(lèi)有:
public class BitmapData :想了很多方法,這個(gè)類(lèi)都用上了(可能我思維局限吧,!)
public class ByteArray :將圖象數(shù)據(jù)轉(zhuǎn)換為字節(jié)流,此類(lèi)也必不可少
使用以上兩類(lèi)完全可以實(shí)現(xiàn)對(duì)視頻流的截圖以及轉(zhuǎn)換,不過(guò)Flex還提供了一個(gè)類(lèi)可以實(shí)再這樣的功能:
public dynamic class ImageSnapshot :看名字就知道是實(shí)現(xiàn)什么的了
以上的幾個(gè)類(lèi)說(shuō)明及用法在 ActionScript 3.0 Language and Components Reference 這種參考文檔里都可以找到,這里就不介紹了。我這的需求當(dāng)中只需截圖轉(zhuǎn)換即可不需要第三個(gè)類(lèi)來(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)很清楚了,就不寫(xiě)過(guò)多的費(fèi)話了。這一部分結(jié)束;
2.Flex中Socket的實(shí)現(xiàn)
Socket 類(lèi)使代碼可以建立套接字連接并讀取和寫(xiě)入原始二進(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
2 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類(lèi)的一個(gè)方法 accept,此方法在未接收到數(shù)據(jù)時(shí)是阻塞的:
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),代碼如下:

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在處理圖片上進(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),

這是我第一次寫(xiě)B(tài)log,請(qǐng)多多支持
