基於java Red5服務器客戶端視頻聊天室(ldfu)
開發環境:
Red5(視頻服務端內嵌Tomcat6),Mina(高性能 socket通訊框架),
Flash(Flex) Builder4,Myeclipse8.0,java sdk6.0
一.先看看客戶端的界面,呵呵。
(1)Flash Buidler開發原型圖
(2)全屏圖:
(3)UI部分源碼:
(4)服務器啓動:
(5)開始視頻接受對方數據流以及聊天記錄:
二.原理:
(1)服務器啓動ServerSocket監聽RTSP協議數據流;
@Override
public boolean appStart(IScope arg0) {
/**
* 此應用啓動時,第一個觸發
*/
System.out.println("服務器啓動成功!");
return super.appStart(arg0);
}
(2)客戶端Flash啓動獲取攝像頭以及音頻輸入顯示在本地左下方區域;
private var rtmpUrl:String="rtmp://192.168.1.100/chatlive";
camera= Camera.getCamera();
if (camera!=null)
{
writeMessage("您的系統已經安裝攝像頭");
camera.addEventListener(ActivityEvent.ACTIVITY,cameraActivityHander);
camera.addEventListener(StatusEvent.STATUS, cameraStatusHander);
this.myVideo.attachCamera(camera);
}
else
{
writeMessage("您的系統沒有安裝攝像頭");
}
mic = Microphone.getMicrophone();
if (mic!=null) {
writeMessage("您的系統已經安裝麥克風");
mic.setSilenceLevel(0);
mic.gain = 100;
}
else
{
writeMessage("您的系統沒有安裝麥克風");
}
(3)客戶端Flash連接Red5服務器是否已經存在,存在則從服務器獲取一個
自己的ID.不存在着提示:
nc = new NetConnection();
nc.client = this;
nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
nc.connect(rtmpUrl, localUsername);
(4)哈哈,其他代碼暫時不公佈,呵呵。
三.此視頻架構缺點:
1.客戶端需要服務器來中轉數據流,嚴重依賴於服務器;
2.嚴重地佔用服務器的資源,包括CPU,內存以及網絡帶寬,可擴展性差;
除非像ku6那樣每年給電信燒十幾億的帶寬費;客戶端越多,服務器
需要越多,帶寬要求越高。
四.感言:
這種架構沒有太多錢投資情況下,幾乎是無法運行的,呵呵。所以我想基於
P2P架構進行點對點聊天。經過多天的摸索,目前已經找到一種點對點直接視頻
方式,它不需要服務器中轉。不過稍微深入一點的技術,其技術難點:
(1)如何穿透在NAT服務器後面的私有內部網絡進行UDP數據傳送,因爲你的內部
IP地址在外面是看不到,外面也是無法主動連接內部IP;
(2)如何穿透防火牆的阻攔;呵呵,現在的公司一般都打開http 80端口,我們就在這個
上面下功夫,那就是利用Http隧道穿越!或JXTA技術,is No Problem。
(3)以怎麼樣的協議傳送視頻音頻數據
(4)如何獲取攝像頭以及聲音;
目前(1),(2)兩點已經實現基本的解決方案代碼,加油,有挑戰性,呵呵