|
|
只是把以前做的单个的功能整合了一下,本来还想弄个FMS的视频聊天,不过虚拟空间没办法..0 A8 A6 R: ]. j
http://www.iphper.com/copstr* _$ ^; R3 i- \# s
光是留言板+在线涂鸦就几百行代码(看来效率低了点)- B+ c3 j2 p: \( u w4 n6 f% \; b+ ?. l
% O3 ]$ o$ A+ U# d. t5 B
- z$ @2 K: ^0 U7 q1 Z8 ^1 NFMS服务器的设置简单的仿照(一)就可以了,这段代码延续(一),加上了视频和语音发布,主要用到netstream.publish()方法,该方法也可以用于视频在线录制,除了检测摄相头和MIC状态的代码外,就增加了十几行的视频发布代码,有关摄相头和MIC的详细设置我并没有写,只是让大家看清楚它的工作原理,没有摄相头的朋友(我就没有摄相头)可以这样测试:打开麦克风说话,如果能听到回音就说明发布成功了
; T$ a! o7 q4 ^" n% E( |3 y. I% V9 V5 ` u! f9 t9 D- _' r# @) Q
" ~8 G3 b: g( N( X) S8 L/ F) O- y* {
) |( ]8 `: G/ k; B* l4 n//建立与服务器的连接.
! Q d7 Y; |6 W: L. \7 Y& _ P- M2 tvar sv_uri:String = "rtmp:/recordstream";
* e' a9 F7 j8 I* L2 Kvar my_nc:NetConnection = new NetConnection ();7 D% Q4 J \ u- N6 B
my_nc.connect (sv_uri);/ U' A' ] n+ [3 o/ P7 ]
//新建共享对象;; I5 Y4 W" Z6 I' G9 q1 ?
my_nc.onStatus = function (thisObj:Object){ s5 T7 U3 u1 J: w
if (thisObj.code == "NetConnection.Connect.Success"){8 \% V+ J" \% i: y! t
info_txt.text = "连接服务器成功!!";
1 V+ G! {& |: f# { info_txt.textColor = 0x66CC00;# y( k+ R' h. _# ]
}
- K$ [5 [# S. v( F, f' I, U. j! O7 B else{0 L" g+ s# |+ H: r
info_txt.text = "连接服务器失败!!"# c$ I# x$ u r: @) \, K) k, }
info_txt.textColor = 0xFF0000;
O! l, z" ]. O. G/ J$ a* g }
9 \) F# G8 J( b% D) W6 M6 E} e# D ^$ g( [) s
var user_rso:SharedObject = SharedObject.getRemote ("chat_rso", my_nc.uri, true);
" Q6 T9 }2 q4 N; m! b0 l( B' Ruser_rso.connect (my_nc);
& g c* D+ x }" U/ ^//建立摄相头和麦克风对象# L. @- m- P- s' z' q( w5 z
this.cam = Camera.get();' w( R/ M( Z2 _6 t2 D# E6 E
this.mic = Microphone.get();1 E: V! ?" i, u! [
videobox.attachVideo(this.cam); s6 t4 ~" l& ?+ G2 b8 _1 _7 z
videobox.attachAudio(this.mic);- R i0 t6 H! G5 j! `& P6 J, s* ~
send_ns = new NetStream(my_nc);' E* n, Y( U0 ?* W. `) Q
send_ns.attachVideo(this.cam);
& j; w; u( y% N$ Fsend_ns.attachAudio(this.mic);
6 v9 J; K& S$ @8 n. P6 n5 Ssend_ns.publish("humorguy");
' _- h- u# {7 f7 m/ R% yget_ns = new NetStream(my_nc);
! p7 s8 W! f2 N5 Yget_ns.play("humorguy");
4 A1 A( R: t, D! _videobox2.attachVideo(get_ns);
3 V* u. V. U x0 [; Z//更新聊天内容3 X7 P" p5 P0 \. Q
user_rso.onSync = function (){
1 L. X8 p- W4 c8 X* W2 D6 R chatOutput_txt.text += newline+this.data.chatname +":" + this.data.chatcontent;2 {8 j4 ?; O' n
chatOutput_txt.scroll = chatOutput_txt.maxscroll+1;//确保最新消息能显示在输出框里/ f7 g/ R, n) U8 ^/ @0 y) {8 S
}
$ v& }5 j2 k, Q p( O0 g' b//回车键发送聊天内容 l' U6 Q4 [; n/ [1 @$ A4 x! Z
function myOnKeyDown() {2 a0 v3 d7 B/ k `" {+ C, v
if (Key.getCode() == 13) {
3 M- E0 t9 F7 A: s if(chatInput_txt.text != undefined && chatInput_txt.text != user_rso.data.chatcontent){
' }; o( v Z& X' n1 W x v, C/ | Selection.setFocus(chatInput_txt);
X" {- L: Q: T/ l& y! k1 k user_rso.data.chatcontent = chatInput_txt.text;! ~ k# d/ c" e" q6 z
if(name_txt.text != "" && name_txt.text != user_rso.data.chatname){
7 `' f5 F" W+ Y: z user_rso.data.chatname = name_txt.text;
6 t/ A/ q+ ?! B) H& g }' r1 d7 i% m# {8 ^. A$ u( m
}; m. O! V+ u/ o7 p. q
}: A4 ]* p" s" d
} n o1 Z: b$ o1 x. {- s! p* H
var myListener:Object = new Object();* P# g. Y" n4 z4 f. P2 E
myListener.onKeyDown = myOnKeyDown;
+ ~$ }! t4 r% m& o- [4 j P: _; fKey.addListener(myListener);+ O0 @4 S1 Y9 R$ L" j; e
//构造检测摄相头和麦克风状态的函数
, T- c# F6 z5 [, L; ifunction checkforCam_Mic() {/ I: s& g# j0 F( L
camArray = Camera.names;' R" x; P: H" m" L$ w6 q0 K
micArray = Microphone.names; S5 `' q5 O4 m, s
if (camArray.length>=1) {
$ r/ y4 K) d) ?3 M+ G E$ w temp_cam = Camera.get();
$ V1 }' D! Y) v* l8 N. e if (temp_cam == -1) {
5 Y2 ^. }( v* Q, { camInfo_txt.text = '视频设备正忙!';* N+ A8 ?5 r. O: ]
camInfo_txt.textColor = 0xFFCC00;& K- y8 k0 |0 r7 F5 }9 }) C
} else {7 S/ Y0 e/ Z) I2 ~, e
camInfo_txt.text = '视频设备可用!';# a2 b: w$ p3 m: f. p
camInfo_txt.textColor = 0x66CC00;9 o6 J, r. [( [+ ]
}7 `: \5 ?6 T6 O+ p- k3 G, A3 \0 l
delete temp_cam;7 d& k7 w+ \ f+ Q
} else if (camArray.length == 0) {
( X g2 s! T2 h8 A1 _6 H camInfo_txt.text = '没有视频设备!';
9 W% a5 x, z' A: T" I4 O camInfo_txt.textColor = 0xFF0000;
, ]9 j2 x' w9 T/ K) G' l1 x) N) E }
1 E4 L5 \' u+ j2 \5 X //检测麦克风状态
* K- q) X; z5 o if (micArray.length>=1) {: ~ B* k+ p! Y
temp_mic = Microphone.get();7 s* i( i; ]( ~0 y# {9 ^0 ^
if (temp_mic == -1) {5 s" `# V9 k% U, ^, {: g5 E
camInfo_txt2.text = '麦克风正忙!';5 C! S' \3 D4 v# l9 ]3 A0 n
camInfo_tx2t.textColor = 0xFFCC00;
! E( F, Z6 U* L% Q; [8 W' C } else {
8 u L' d5 G: k; A& M camInfo_txt2.text = '麦克风可用!';
1 q" h9 w4 h. J+ F' e7 I- } camInfo_txt2.textColor = 0x66CC00;7 o: }4 `+ r" z! h4 b$ M' G' w1 v
}
6 } e! w) U# P delete mic_cam;
5 N: y. _: s" U: }: g* t1 T s } else if (micArray.length == 0) {% x. h/ a1 H! M! h0 O J% B
camInfo_txt2.text = '没有麦克风!';: u5 x- u0 S. e- @5 M9 O L; b
camInfo_txt2.textColor = 0xFF0000;* d9 L* Y2 A2 E
}" {& L$ N: E( _ q5 |2 Q; I5 K2 o- Q
}, }4 q1 C7 h4 J3 R( i2 [
checkforCam_Mic(); |
|