|
|
只是把以前做的单个的功能整合了一下,本来还想弄个FMS的视频聊天,不过虚拟空间没办法..6 |. j2 S5 p4 j7 w9 l" F9 `7 u
http://www.iphper.com/copstr3 y3 } K: K" K- `. [- t
光是留言板+在线涂鸦就几百行代码(看来效率低了点); t6 D: q' x' v/ W+ H0 O6 ^2 _4 r/ K8 [
: x; k P* B8 H
; e; r' K" Z$ g, {FMS服务器的设置简单的仿照(一)就可以了,这段代码延续(一),加上了视频和语音发布,主要用到netstream.publish()方法,该方法也可以用于视频在线录制,除了检测摄相头和MIC状态的代码外,就增加了十几行的视频发布代码,有关摄相头和MIC的详细设置我并没有写,只是让大家看清楚它的工作原理,没有摄相头的朋友(我就没有摄相头)可以这样测试:打开麦克风说话,如果能听到回音就说明发布成功了
$ G' a6 H3 U& R; n
8 v+ y! V+ s4 l0 w( a6 p
& c7 `4 J9 R- d: H3 N: Y7 F/ ]
! z+ c4 L: Z& k* v//建立与服务器的连接.
: S! n' G' q3 b0 a9 pvar sv_uri:String = "rtmp:/recordstream";
2 X8 f% a: Z6 a% T- {) ^var my_nc:NetConnection = new NetConnection ();
7 f% l* k J: U! p( V8 Z* xmy_nc.connect (sv_uri);( f' Y3 B( U; Z2 n# S
//新建共享对象;9 Q7 w1 e7 P1 E. }
my_nc.onStatus = function (thisObj:Object){
" i% k2 d% F% B3 z* { if (thisObj.code == "NetConnection.Connect.Success"){
& U0 \- j3 K, v& T info_txt.text = "连接服务器成功!!";
1 K+ S( t/ a2 h$ L% Z6 f* e info_txt.textColor = 0x66CC00;
& H; x% I8 g9 a4 ]# B2 i4 m9 F7 R }2 t8 c- Q, `) g( z
else{
. S+ G% F% L" x6 G info_txt.text = "连接服务器失败!!"5 E* W+ X. {! b# f3 [& _8 b
info_txt.textColor = 0xFF0000;' b& J- C. N! B% o3 S$ u* B
} r5 h* Y/ u. Q
}
5 V$ R, E* u. g+ Y+ g5 Q. p/ n% vvar user_rso:SharedObject = SharedObject.getRemote ("chat_rso", my_nc.uri, true);
; E5 K J9 }, R& zuser_rso.connect (my_nc);
+ }) {. ~8 b1 x9 K% |/ n//建立摄相头和麦克风对象
' U( L' e1 h0 u: b7 n6 Rthis.cam = Camera.get();3 w8 ~4 w4 ^# [5 g( p" |' Q' R4 }
this.mic = Microphone.get();
; c% M" {6 U- q. u9 Dvideobox.attachVideo(this.cam);
+ q2 q1 r" i. Y7 h; ?7 N1 Bvideobox.attachAudio(this.mic);4 r1 u: o2 Y6 I' w" K/ j! s' a
send_ns = new NetStream(my_nc);' M! f! [* d4 G. i
send_ns.attachVideo(this.cam);
2 V- d3 P+ u" ~3 Gsend_ns.attachAudio(this.mic);
2 s0 I+ z7 M5 B% H8 H9 qsend_ns.publish("humorguy");% r' U4 T2 ]5 i7 ~5 d& I3 S5 E
get_ns = new NetStream(my_nc);! O* j$ J5 [ v; w" l3 r) w; |5 E
get_ns.play("humorguy");( M) p: Y/ }: t) E
videobox2.attachVideo(get_ns);
7 ]* b, i) ]# x: N% b3 d//更新聊天内容4 v! Y3 u( c% H4 E! x, O' q" J2 Z, H
user_rso.onSync = function (){+ s% t3 z+ I' r+ _! ]! }) g2 V
chatOutput_txt.text += newline+this.data.chatname +":" + this.data.chatcontent;
& u' z( V* {1 S% }! q. p0 U chatOutput_txt.scroll = chatOutput_txt.maxscroll+1;//确保最新消息能显示在输出框里
& P, e0 V; |9 q# d, `+ c& [}
$ |5 s4 m$ E) e//回车键发送聊天内容
, s- n w/ O9 m. x# @' q: Sfunction myOnKeyDown() {5 Q1 @9 M! ^1 ]5 L3 D5 A. E
if (Key.getCode() == 13) {
8 i5 w; \! `. [6 \ if(chatInput_txt.text != undefined && chatInput_txt.text != user_rso.data.chatcontent){/ O/ k: w' j8 m, K8 S! M5 D% ]
Selection.setFocus(chatInput_txt);+ N5 l5 K# w+ z9 O$ F
user_rso.data.chatcontent = chatInput_txt.text;
- R/ b1 \% n% F6 W/ ?) W if(name_txt.text != "" && name_txt.text != user_rso.data.chatname){
. U- y4 [$ p; ]2 S) k. z: a# [7 Y& W user_rso.data.chatname = name_txt.text;
% t' A0 G& S2 q) x! }/ F( s3 h }
6 F u) O' s3 _/ c1 e% Z9 T }6 g8 Q/ y# w7 G9 S+ P ^
}
$ q% y3 `( B( B4 H4 d}3 b% y2 v+ X4 l0 ~
var myListener:Object = new Object();$ ]& ^9 P9 u% [$ q0 F: A' @1 C
myListener.onKeyDown = myOnKeyDown;$ _1 M/ |. i6 a* {8 K) a
Key.addListener(myListener);
! R W# }4 m- M9 O2 P: {& Q! A//构造检测摄相头和麦克风状态的函数
{" T% R3 f X7 F% Rfunction checkforCam_Mic() {
8 m$ w; ]. w y2 \0 ~+ `/ D. q camArray = Camera.names;
; ?7 n4 n! ?- K T micArray = Microphone.names;2 }7 }: H9 ]6 I& f. z; R
if (camArray.length>=1) {! C+ v! ~" v. L$ Y
temp_cam = Camera.get();! e! F8 m0 d: v1 F0 ^* z
if (temp_cam == -1) {
, `/ O3 Z. _5 F+ h. I" v0 n camInfo_txt.text = '视频设备正忙!';
9 r0 G3 H6 o/ J1 l: g0 V. F9 o" g camInfo_txt.textColor = 0xFFCC00;
) V7 t+ H. [ n2 m: ^/ b } else {/ D( P" m0 t3 ~9 A
camInfo_txt.text = '视频设备可用!';
7 C1 O5 c3 j! m. k camInfo_txt.textColor = 0x66CC00;
3 |/ L! D T" c }5 {% m4 p( _' N/ \
delete temp_cam;% ~& I$ x5 i- n& r
} else if (camArray.length == 0) {9 z3 f* X3 \# b( U- h- x
camInfo_txt.text = '没有视频设备!';8 y& `) J6 Z. Q, Y2 m, d
camInfo_txt.textColor = 0xFF0000;
/ b8 H7 I5 P( c3 m. c }+ S7 Y4 e6 A, }) F
//检测麦克风状态
' F0 B7 \1 g O if (micArray.length>=1) {
2 p- ~8 o( l# e4 N+ }, a; R temp_mic = Microphone.get();2 Q! Q$ u$ o4 N6 v# s m. j! @
if (temp_mic == -1) {
# C: P9 `4 b2 O ?& @ d camInfo_txt2.text = '麦克风正忙!';6 k4 O' H0 g' H; ~: p: e
camInfo_tx2t.textColor = 0xFFCC00;
) Z& t- ~3 H Y, r' j } else {
* \: v. }" d2 X- i3 b4 ^ camInfo_txt2.text = '麦克风可用!';
Q. n/ y; C9 P4 f& e- y1 z0 J camInfo_txt2.textColor = 0x66CC00;4 x' \& ]) ?& k7 ] V2 g- p
}
# m" t$ V. }, i3 [ _ delete mic_cam;8 j7 y) |5 M8 D6 M' `2 R7 s
} else if (micArray.length == 0) {
0 h X3 Z. q: t* x9 o& v- ^+ Z camInfo_txt2.text = '没有麦克风!';
3 _# J1 d9 J% y camInfo_txt2.textColor = 0xFF0000;
* S1 q8 B& l2 {1 M, r }$ z: w' M8 L/ M3 X
}$ A U& g- _9 S9 H) q8 J2 R1 ?, J1 \
checkforCam_Mic(); |
|