|
只是把以前做的单个的功能整合了一下,本来还想弄个FMS的视频聊天,不过虚拟空间没办法..- t* B2 @0 J; K- V
http://www.iphper.com/copstr4 e4 m4 T& C) ]4 P
光是留言板+在线涂鸦就几百行代码(看来效率低了点)+ i1 Y$ D2 E( P. [2 l
8 o& l2 Y( W+ S2 e0 o6 {7 M; p, z
2 Y u6 R* Y4 u& @FMS服务器的设置简单的仿照(一)就可以了,这段代码延续(一),加上了视频和语音发布,主要用到netstream.publish()方法,该方法也可以用于视频在线录制,除了检测摄相头和MIC状态的代码外,就增加了十几行的视频发布代码,有关摄相头和MIC的详细设置我并没有写,只是让大家看清楚它的工作原理,没有摄相头的朋友(我就没有摄相头)可以这样测试:打开麦克风说话,如果能听到回音就说明发布成功了
: V: Y, C# }, P0 `3 {) i" k0 `2 k9 w9 N
" N) P; X/ \3 R8 @) z! k" a: r6 Q, O, D6 @- ~% _* V/ r
//建立与服务器的连接.$ L% m" I, E& B& U2 C
var sv_uri:String = "rtmp:/recordstream";; n( s$ }! x- W5 u- v1 `
var my_nc:NetConnection = new NetConnection ();
2 p9 g0 Z8 O% i- j; rmy_nc.connect (sv_uri);& _' w) T8 L2 P- R! [; ~8 x
//新建共享对象;
; h+ D+ F" B0 U/ ^' kmy_nc.onStatus = function (thisObj:Object){
1 Q( k8 @* ^9 d0 ?6 o if (thisObj.code == "NetConnection.Connect.Success"){" r/ v. c3 I, C8 X7 ]
info_txt.text = "连接服务器成功!!";- I2 i* W. x: P% h5 e& z. Y
info_txt.textColor = 0x66CC00;
( l) y1 m! B4 H! q5 e" a3 d5 I }
5 Z* E" W2 e$ a' A else{
1 Y7 `. }; [+ S8 H% I; f6 i info_txt.text = "连接服务器失败!!"
: ]4 s9 d2 E, m1 s! M info_txt.textColor = 0xFF0000;
. P- U4 m% Z. ]5 U. I4 ^9 T; h }+ A4 f$ W" k* f% s5 G% R6 ?/ r# W' g
}
8 H0 x* z* G, ?5 _var user_rso:SharedObject = SharedObject.getRemote ("chat_rso", my_nc.uri, true);
: i4 H" E: i4 V4 M" cuser_rso.connect (my_nc);2 W; u% o: Q) r" Q& Z; N
//建立摄相头和麦克风对象8 z0 ~* B; b, Y+ j. f* ^* x) J
this.cam = Camera.get();, M5 R" V+ c1 P2 \
this.mic = Microphone.get();
2 f4 J9 s1 c. M- Nvideobox.attachVideo(this.cam);. G: J/ z2 Q" [# b4 a* J) {* b) q
videobox.attachAudio(this.mic);2 t& @1 i* j( w' F- J1 ]
send_ns = new NetStream(my_nc);% `: {+ n% A9 B( c% ~3 I4 K
send_ns.attachVideo(this.cam);
1 o. Z" m+ o7 Y( v0 D' psend_ns.attachAudio(this.mic);' B2 U+ _7 j8 z7 A- F. |
send_ns.publish("humorguy");6 `) b& i O9 w
get_ns = new NetStream(my_nc);9 P8 P' @& y+ Q: q" d' i
get_ns.play("humorguy");+ Y) y [1 B! Q1 O7 G
videobox2.attachVideo(get_ns);- D& O6 |' {# _9 i. T8 |
//更新聊天内容
8 x3 t; W2 O$ {( Kuser_rso.onSync = function (){1 X g4 N9 B* [! S& }% h
chatOutput_txt.text += newline+this.data.chatname +":" + this.data.chatcontent;" M- J& |/ y+ f. w2 l1 G: I. M- O
chatOutput_txt.scroll = chatOutput_txt.maxscroll+1;//确保最新消息能显示在输出框里' F. O2 K, ~" e z. g- w
}) o; g, e) d: p. N U
//回车键发送聊天内容% Q1 i# \% q+ X
function myOnKeyDown() {% q" Y8 F. e, }3 }
if (Key.getCode() == 13) {/ U& n- Y8 Y3 q
if(chatInput_txt.text != undefined && chatInput_txt.text != user_rso.data.chatcontent){% \. H L; L& t5 g
Selection.setFocus(chatInput_txt);' o% `6 L1 M% ^# u
user_rso.data.chatcontent = chatInput_txt.text;. \1 r9 _+ q" H. z
if(name_txt.text != "" && name_txt.text != user_rso.data.chatname){
# M. u1 i" C& a A$ f7 @. c- W user_rso.data.chatname = name_txt.text;
5 B2 ~( d6 O9 ^3 y6 Q+ H) _ }
( n$ d. j9 c) l }% M. @+ _! c+ |; \
}
5 ]$ O( W a8 t$ C: [0 F* B}
0 P* h* n$ l" `9 O3 s- ovar myListener:Object = new Object();
3 e' D( t. i' A& @! NmyListener.onKeyDown = myOnKeyDown;
+ K" x* @3 S: kKey.addListener(myListener);
0 o2 S: Q+ _# w4 @' Q//构造检测摄相头和麦克风状态的函数! I! \. n: t9 [( v: C7 v
function checkforCam_Mic() {2 ? R6 \* V0 ^$ V2 |# R1 V0 n% s
camArray = Camera.names;
2 a% X# @ L) m) [$ Y& E4 a2 R$ T micArray = Microphone.names;
0 O% b' e& L( y6 e! ~0 R" W if (camArray.length>=1) {
: ~2 I: U- u/ D4 o' S7 ?7 x temp_cam = Camera.get();
7 k. k5 [; O- G, P' g if (temp_cam == -1) {
9 V. z7 ^1 M$ @' _' Z camInfo_txt.text = '视频设备正忙!';$ t1 A+ X2 t' }4 M$ G0 Z
camInfo_txt.textColor = 0xFFCC00;
/ t) T: `' k& S7 G; R# t } else {
4 U! T! ]9 G) ?4 k, G4 _+ N7 M( g camInfo_txt.text = '视频设备可用!'; c# g" b/ L. s+ u% g& _/ P
camInfo_txt.textColor = 0x66CC00;6 t" m5 m0 Y( i5 D+ r
}
3 ^4 z) k; ]+ H4 e5 \ delete temp_cam; Q8 \7 b a7 B9 I
} else if (camArray.length == 0) {
: S# Y2 p- _# Y, Q5 i1 G' A: s camInfo_txt.text = '没有视频设备!';
& M6 }2 T, T& E' E. U3 x6 z& d# q3 v camInfo_txt.textColor = 0xFF0000;
% t: X4 |# x- D9 C( B' k }+ a) @! M# A' w/ t
//检测麦克风状态 ! p4 c7 _: N- T6 y& B$ p
if (micArray.length>=1) {/ |3 i! O9 v4 u9 N; F$ Y
temp_mic = Microphone.get();
! S0 J: Y* B2 u! |7 a, t% D9 n | if (temp_mic == -1) {
/ |3 V6 [; ^4 |( P( c camInfo_txt2.text = '麦克风正忙!';
* i L1 Y/ R* {5 L% y+ Z* u; c camInfo_tx2t.textColor = 0xFFCC00;) f9 e7 H C. j5 q+ d$ q5 v& ~: T4 f
} else { F! J0 D- z7 a y
camInfo_txt2.text = '麦克风可用!';
' S, y+ H {( d4 T" u7 } camInfo_txt2.textColor = 0x66CC00;
3 f# R; X$ m' Z$ u# w! a! ?/ I }$ w" ]# q& c! j( z. q `. x
delete mic_cam;0 R$ X! k# r9 ?. Z' D
} else if (micArray.length == 0) {
: ^! G. h! R) I camInfo_txt2.text = '没有麦克风!';
% m- n, r$ \3 I) O. N# O4 q camInfo_txt2.textColor = 0xFF0000;
' r6 s! [: x3 ~9 q }# n- j% v4 k1 v& ?& M
}3 Z6 z, n0 d; {: Y- H* H% |
checkforCam_Mic(); |
|