|
|
只是把以前做的单个的功能整合了一下,本来还想弄个FMS的视频聊天,不过虚拟空间没办法..% _% Z3 I, P/ G- P; o3 Z9 ]
http://www.iphper.com/copstr/ ~, E, L* L8 d: q6 Z$ s$ x; ]- X
光是留言板+在线涂鸦就几百行代码(看来效率低了点)( X4 w/ w& C' ]9 A3 h( j3 U
) {9 F. S$ y" F7 @) M4 r0 {7 s
& k. N$ D2 s* {+ n& _FMS服务器的设置简单的仿照(一)就可以了,这段代码延续(一),加上了视频和语音发布,主要用到netstream.publish()方法,该方法也可以用于视频在线录制,除了检测摄相头和MIC状态的代码外,就增加了十几行的视频发布代码,有关摄相头和MIC的详细设置我并没有写,只是让大家看清楚它的工作原理,没有摄相头的朋友(我就没有摄相头)可以这样测试:打开麦克风说话,如果能听到回音就说明发布成功了
7 b( [& P5 i+ a# r x1 B- _. q% [: K5 H% X. J b$ Q9 t- t# K. p
3 I$ k2 W! P' k% g k
& D M- a# U: u7 l6 o" n, b
//建立与服务器的连接.; }) R1 C0 A: C# ~. H
var sv_uri:String = "rtmp:/recordstream";) g6 Q9 o1 w1 ~& l5 [
var my_nc:NetConnection = new NetConnection ();
2 L( V9 R. j! f& Kmy_nc.connect (sv_uri);
9 R$ a/ ~3 G; H, @/ [. m' P//新建共享对象;, c* y! @4 t: [! `/ f9 C
my_nc.onStatus = function (thisObj:Object){
3 m" K$ b' v/ ?+ a8 a$ q: { B6 g% I if (thisObj.code == "NetConnection.Connect.Success"){
: {* F; ~0 ^+ U9 e. |! b, K info_txt.text = "连接服务器成功!!";2 T* h% s$ t5 X- M; ?. j' p
info_txt.textColor = 0x66CC00;$ b) O+ x7 V; A4 e
}
3 p) h, h) J+ H; a else{6 C0 B, Q! Z) f5 G! W& T4 W/ Z# L0 n
info_txt.text = "连接服务器失败!!"" h8 @/ X( I) C
info_txt.textColor = 0xFF0000;
" d& c8 ~' ?, {1 \! y- P }
& `& c- ^' W1 J8 j' F5 N: w}; a4 y. A c: |+ N5 Y, G% D5 M: i1 Y
var user_rso:SharedObject = SharedObject.getRemote ("chat_rso", my_nc.uri, true);
8 h- x( I+ P, e8 ruser_rso.connect (my_nc);* q S2 C* w8 J
//建立摄相头和麦克风对象" m/ [1 R; w! M- [4 j) v+ y2 \
this.cam = Camera.get();
) C; [7 A3 `; Vthis.mic = Microphone.get();& M3 w$ g( m4 N/ @1 H, T. u- t
videobox.attachVideo(this.cam);' w' s, L# D7 _9 x) y3 x% e; j7 N4 f7 f
videobox.attachAudio(this.mic);( K1 j, K. i, G5 W( l- |1 q; _) d( z
send_ns = new NetStream(my_nc);, s1 l% e- z5 a
send_ns.attachVideo(this.cam);
' m2 A6 @1 Z1 @! u# Dsend_ns.attachAudio(this.mic);
8 K+ r3 G4 o5 b3 S/ Hsend_ns.publish("humorguy");
6 @6 ^: q+ B% e( ^get_ns = new NetStream(my_nc);
! T/ U2 }) T. J0 dget_ns.play("humorguy");9 R6 n3 n4 l$ |0 m# [
videobox2.attachVideo(get_ns);4 R( @5 u4 O4 {5 P6 ]* H
//更新聊天内容
2 v& P0 P& m! U; q4 L7 zuser_rso.onSync = function (){
& I0 i# B6 f' G' O chatOutput_txt.text += newline+this.data.chatname +":" + this.data.chatcontent;/ s z. ?" O- |; g- D6 @
chatOutput_txt.scroll = chatOutput_txt.maxscroll+1;//确保最新消息能显示在输出框里 ~; N# K3 A& i9 L. c, {1 | j
}
2 F! p I2 X5 M, k" B" c//回车键发送聊天内容1 [$ X- o$ V% @8 L3 n P
function myOnKeyDown() {2 U1 k( a* G. K! M. n$ n- I" {0 ^( S# V
if (Key.getCode() == 13) {
: D! v# u+ Y& y+ m* k2 J& s if(chatInput_txt.text != undefined && chatInput_txt.text != user_rso.data.chatcontent){
$ K- b& N; U5 F& y Selection.setFocus(chatInput_txt);
6 R. N& F# o% z3 e' [$ {4 E5 K user_rso.data.chatcontent = chatInput_txt.text;6 o1 q4 G9 L, [. \' o8 _
if(name_txt.text != "" && name_txt.text != user_rso.data.chatname){
. y+ J6 q8 |/ t. F& r user_rso.data.chatname = name_txt.text;* C9 `5 A$ P. I
}! K8 d$ y) `+ }. H2 b
}
/ |1 N) Q: L' q5 d. o2 ~1 d }
% \7 K, n) p- {! q* u) {}
( f+ y5 c6 ]3 w% D% z6 F' ovar myListener:Object = new Object();* \3 w5 l4 `4 o6 b* k5 r
myListener.onKeyDown = myOnKeyDown;4 d E f" n( C
Key.addListener(myListener);
5 l$ a; r, { d! a: V9 \/ P2 Q//构造检测摄相头和麦克风状态的函数' B0 [8 p2 a. G0 _4 P6 i
function checkforCam_Mic() {
$ `/ Z2 Y% i0 {/ N9 a ~ camArray = Camera.names;9 ` |) C e/ @7 U% Y' ~
micArray = Microphone.names;
: W6 @. c* W6 T$ J3 A& Y: u, \1 f$ Z if (camArray.length>=1) {- Y/ Z( L! Z* V
temp_cam = Camera.get();
3 ?) v4 E) v: z% F$ I if (temp_cam == -1) {
( w7 N. P/ C+ {: f9 U! f0 J! e camInfo_txt.text = '视频设备正忙!';; u1 W$ V' u0 ~1 B7 k8 ~
camInfo_txt.textColor = 0xFFCC00;2 {1 s8 `' t5 F* j- z! Y# o$ N
} else {8 Z L. }1 C& c5 w! ]7 U. w
camInfo_txt.text = '视频设备可用!';+ @' i ?% C9 ?5 f* Z% U9 O/ H, p3 }
camInfo_txt.textColor = 0x66CC00;% }2 ^3 s) a6 e; M" U4 x
}
& M8 I+ v2 r2 D% w: g delete temp_cam;
" K1 e5 g6 f2 E8 q } else if (camArray.length == 0) {4 y) k6 _ Z4 ^* ^& L
camInfo_txt.text = '没有视频设备!';' ~0 E0 E1 I2 Z. `3 ^) p
camInfo_txt.textColor = 0xFF0000;
- o# J0 v" j# }" ^+ g- H& T7 h }, J4 g @ Z* a( s
//检测麦克风状态 9 N7 ~7 ~" E _4 K ~( y) `6 N
if (micArray.length>=1) {
+ C. t( I1 B0 _+ n( R0 u) D temp_mic = Microphone.get();
% Q. b0 f/ h) P3 \ if (temp_mic == -1) {5 Q% d2 {" A* g4 O8 H! e
camInfo_txt2.text = '麦克风正忙!';
" T/ s) h$ i& R& p2 k' N camInfo_tx2t.textColor = 0xFFCC00;( \! R/ d" E2 V8 t; s7 V5 f; W
} else {
& p7 @/ i- h- s9 w2 ^; b8 i camInfo_txt2.text = '麦克风可用!'; Y: e: F2 J4 ?
camInfo_txt2.textColor = 0x66CC00;
8 J! v0 [" X* ~ }5 s2 G: I( A6 N' @7 G+ ?
delete mic_cam;
, n" _8 u( S- U. s, ^+ S } else if (micArray.length == 0) {1 ~* [2 X0 v, z2 {5 r
camInfo_txt2.text = '没有麦克风!';* }) {5 K" ^; j8 o1 c2 @9 J1 a
camInfo_txt2.textColor = 0xFF0000;
0 h( e% P3 S1 [' s }
1 l$ M: o; |3 O- W' v}6 | g% O, F' o
checkforCam_Mic(); |
|