|
只是把以前做的单个的功能整合了一下,本来还想弄个FMS的视频聊天,不过虚拟空间没办法..3 _( T8 N3 U) `. A; v
http://www.iphper.com/copstr
/ r$ Q, U F* H) x% G% ]% G光是留言板+在线涂鸦就几百行代码(看来效率低了点)+ S6 P. M: X4 [3 k
% f- Z/ `6 a# G3 C' B
. K+ ]" [3 |2 Q5 `5 a8 p; p4 N" UFMS服务器的设置简单的仿照(一)就可以了,这段代码延续(一),加上了视频和语音发布,主要用到netstream.publish()方法,该方法也可以用于视频在线录制,除了检测摄相头和MIC状态的代码外,就增加了十几行的视频发布代码,有关摄相头和MIC的详细设置我并没有写,只是让大家看清楚它的工作原理,没有摄相头的朋友(我就没有摄相头)可以这样测试:打开麦克风说话,如果能听到回音就说明发布成功了2 u. s( ]: g) n5 m0 f4 z t9 y
0 q; I/ O& M* L' H: O) D# j
. R0 v: ]" D( e. j3 r
/ `2 Q, `! c! ^) w2 b3 N//建立与服务器的连接.
* a, P! H) u* {# tvar sv_uri:String = "rtmp:/recordstream";+ R1 i9 ]+ N+ e) E# w H
var my_nc:NetConnection = new NetConnection ();5 ?( @) |; A; y+ k5 p7 o6 F+ [
my_nc.connect (sv_uri);1 i. k+ J* f- F+ V7 [
//新建共享对象;+ D9 ?! R; L6 x- M+ E5 ~5 G( k
my_nc.onStatus = function (thisObj:Object){
# g/ Q' Y. N; I; |: ?- z if (thisObj.code == "NetConnection.Connect.Success"){
6 }7 ~0 d& w' V; {+ {# y info_txt.text = "连接服务器成功!!";) {9 g/ p; n0 l! {8 R5 |( v
info_txt.textColor = 0x66CC00;( } h6 ?# M" E g* S" C. x
}! s' [) D f: L. Q* I& d
else{
3 } A( z+ C: P$ U U info_txt.text = "连接服务器失败!!"
( X% o3 P6 S4 e# C. i info_txt.textColor = 0xFF0000;" K" x7 |0 c1 [" R9 K
}& @4 F) z8 D& _1 I
}, a7 h3 s( b) U) L$ `( t2 X2 ?& i
var user_rso:SharedObject = SharedObject.getRemote ("chat_rso", my_nc.uri, true);. i$ i! H, u% W
user_rso.connect (my_nc);
c" E' \# e5 {: W//建立摄相头和麦克风对象
; ] a6 i/ T" D/ Y, Hthis.cam = Camera.get();
! x( t6 y8 z! c. Y0 z+ [this.mic = Microphone.get();
" v" Y( l8 L1 _# y7 Zvideobox.attachVideo(this.cam);
7 n$ m+ }8 X+ Y' E3 r5 c$ {9 a% P* qvideobox.attachAudio(this.mic);' ~* ?, c, M z
send_ns = new NetStream(my_nc);8 I" l" [1 b* X
send_ns.attachVideo(this.cam);
$ b( s+ ^$ `" N7 E3 i9 `) N. V, dsend_ns.attachAudio(this.mic);
7 _ x6 p( J, Y* Q9 `. Usend_ns.publish("humorguy");
- j& x. r7 v) K3 d( b3 z! pget_ns = new NetStream(my_nc);
$ ]' g% @+ J, H4 Nget_ns.play("humorguy");: [2 t/ ~" K& E& M" L1 Z
videobox2.attachVideo(get_ns);; J5 o% Y: b2 S* B. F2 _7 e M
//更新聊天内容, E2 s: @/ V) q3 b
user_rso.onSync = function (){
/ R+ x7 ~% S/ s/ {: e/ [2 b chatOutput_txt.text += newline+this.data.chatname +":" + this.data.chatcontent;( }% |8 _1 u" I$ d: o
chatOutput_txt.scroll = chatOutput_txt.maxscroll+1;//确保最新消息能显示在输出框里! X, `7 y/ x7 i l ^; @
}
6 d0 T5 P6 n$ U* l; a9 [% q5 v//回车键发送聊天内容
$ J& M0 k; T6 E8 efunction myOnKeyDown() {
" @- W. h, ]! c% J2 G6 f3 Y: M! N if (Key.getCode() == 13) {$ B- r! w# x" I6 Y# b
if(chatInput_txt.text != undefined && chatInput_txt.text != user_rso.data.chatcontent){# O: V* Z* P. ~* A
Selection.setFocus(chatInput_txt);
4 W1 _; f6 J8 G3 j0 s, B2 g. ~: U user_rso.data.chatcontent = chatInput_txt.text;
# j' K+ f6 @. _5 M& `" R if(name_txt.text != "" && name_txt.text != user_rso.data.chatname){7 F: c9 ?+ J# D0 l$ g, d
user_rso.data.chatname = name_txt.text;5 N5 w: V W4 C* R6 L
}
# S! r# U; ^/ q }
3 K4 m4 O! }+ W* c; J- K9 i }
: X9 {$ y' w- z' w}
: F& f. R0 M: q$ R8 zvar myListener:Object = new Object();# C% j: [2 n/ h
myListener.onKeyDown = myOnKeyDown; N. j2 j( B3 {' v6 l9 n
Key.addListener(myListener);( K5 M9 V* K6 N2 a2 W. k% @
//构造检测摄相头和麦克风状态的函数9 g5 ^/ D# m7 P# T5 Y# s
function checkforCam_Mic() {9 d2 F4 X& Y8 R0 f" K; F
camArray = Camera.names;
* r$ I G& c! p0 B micArray = Microphone.names;/ s' z# R. o- I; Y. P8 Z+ @+ u
if (camArray.length>=1) {
O7 o, t) w8 u0 S7 d( O3 C temp_cam = Camera.get();
. d; y! |/ C' L! G( f if (temp_cam == -1) {, Q0 I8 `, {4 [8 a9 L- C
camInfo_txt.text = '视频设备正忙!';6 G2 W& n' e& X( w
camInfo_txt.textColor = 0xFFCC00;
% {' ~$ D+ X" }% [. B9 p: ` \ } else {% [# X( E$ K" j1 i" q
camInfo_txt.text = '视频设备可用!';
^9 P* P' P% h# ?! j9 L camInfo_txt.textColor = 0x66CC00;
1 N2 y2 B, c" j4 V/ [ }
+ E9 v, H" w6 A; p- Y delete temp_cam;
1 c) X; k2 c2 o/ e2 T* S$ q( ^ } else if (camArray.length == 0) {, t3 X& e# j$ Z7 J/ H
camInfo_txt.text = '没有视频设备!';4 v$ W6 Z7 G. G% c
camInfo_txt.textColor = 0xFF0000; c4 S$ }% ?, `
}1 Z7 R2 _7 {1 P
//检测麦克风状态
4 a* [" |$ j8 F$ ~( Z& F: @ if (micArray.length>=1) {
/ \8 [2 }( {! }, { temp_mic = Microphone.get();
3 g. K/ P' h; V2 S1 f" A: m if (temp_mic == -1) {. ~% q$ T. |- X5 |5 v l" j
camInfo_txt2.text = '麦克风正忙!';
1 a% y7 f9 Q: P2 V1 n8 G, P camInfo_tx2t.textColor = 0xFFCC00;
- j1 J6 ^3 X, x5 U/ e! f" i } else {
4 f) h, w' L/ v' J; W camInfo_txt2.text = '麦克风可用!';6 f( \0 ?4 c" E! z
camInfo_txt2.textColor = 0x66CC00;) r: v# D5 O+ U4 s @ R
}' m: a! G: L: d4 Q
delete mic_cam;
. s1 |. W: U; I _: ` } else if (micArray.length == 0) {6 X. q0 ^$ i# y" h
camInfo_txt2.text = '没有麦克风!';
9 q0 q; ~7 {0 Q( Q/ w, {; L camInfo_txt2.textColor = 0xFF0000;2 Z, R7 `) l$ P
}
1 u, [% x: ]" t8 Z}( s+ e' A' E6 y, i9 K+ h
checkforCam_Mic(); |
|