|
|
只是把以前做的单个的功能整合了一下,本来还想弄个FMS的视频聊天,不过虚拟空间没办法..
+ G: Z4 d7 U' ohttp://www.iphper.com/copstr
( Q' c5 b: Y2 {* C光是留言板+在线涂鸦就几百行代码(看来效率低了点)2 L. Z! ^; H! U y- |2 R
" v. h9 m0 _. |
: O9 x- S+ M* Y, ]! r; MFMS服务器的设置简单的仿照(一)就可以了,这段代码延续(一),加上了视频和语音发布,主要用到netstream.publish()方法,该方法也可以用于视频在线录制,除了检测摄相头和MIC状态的代码外,就增加了十几行的视频发布代码,有关摄相头和MIC的详细设置我并没有写,只是让大家看清楚它的工作原理,没有摄相头的朋友(我就没有摄相头)可以这样测试:打开麦克风说话,如果能听到回音就说明发布成功了, _# S! m/ k6 w* s4 A0 V
2 I7 O2 E( `1 w
# r1 o/ T+ r* l% O% k B0 t" o5 L. h6 f5 N* Y1 b5 _( }7 \
//建立与服务器的连接. u% h6 O% g( d4 Y1 U6 M% x
var sv_uri:String = "rtmp:/recordstream";
" C5 @2 r6 Q/ D7 [5 @6 Nvar my_nc:NetConnection = new NetConnection ();
$ S: T# J4 n& O- h( }my_nc.connect (sv_uri);
' V M0 _/ N P) O; @//新建共享对象;! D# ^1 } d7 P
my_nc.onStatus = function (thisObj:Object){
1 m8 x) w6 S# g7 k4 \ if (thisObj.code == "NetConnection.Connect.Success"){
3 p7 z. Y5 W( x info_txt.text = "连接服务器成功!!";
( l$ K5 J. w" a. A4 T info_txt.textColor = 0x66CC00;
3 T, O7 X1 i/ t6 U: P }0 l/ U6 r4 q0 E" w$ ~; ?
else{
Z, M0 V! T- t' R* ^# ^( A; k' t$ a info_txt.text = "连接服务器失败!!") \, Y$ n/ l r1 h `6 V& h
info_txt.textColor = 0xFF0000;
7 Q* r9 @3 s6 b b- ? }
/ H3 w s* @4 ?$ j8 L+ X}% ^$ v7 U( B4 f! t0 H
var user_rso:SharedObject = SharedObject.getRemote ("chat_rso", my_nc.uri, true);7 a0 Y0 r, c. X# ]. R; I
user_rso.connect (my_nc);+ o5 Y! T- S; o; Z/ E3 h. v' T
//建立摄相头和麦克风对象
" D7 ~0 H7 M5 M% Xthis.cam = Camera.get();
1 P, ?0 c& F# R8 i! V( wthis.mic = Microphone.get();8 Y7 q/ n: f3 w$ @' k: H- g
videobox.attachVideo(this.cam);+ [/ ?) @$ A+ ^9 X6 F3 T0 a
videobox.attachAudio(this.mic);# g: L0 B6 O( ]0 u# t5 |7 G
send_ns = new NetStream(my_nc);
- W- F2 d0 G% y/ ?7 h8 b. }send_ns.attachVideo(this.cam);: s0 q( R1 ]- t- ~/ B/ P/ M, _5 E
send_ns.attachAudio(this.mic);1 {' A; c& Q2 t* z; A7 B
send_ns.publish("humorguy");
' L+ d6 Y: N* v9 R2 @" tget_ns = new NetStream(my_nc);; L8 Y) a& V6 z7 K; R! H9 ?
get_ns.play("humorguy");; D9 i/ |. Q( r7 t) p' r1 P5 L) X" b
videobox2.attachVideo(get_ns);/ b) I9 ?4 K. A# i+ S4 b# ?$ R) G9 Q
//更新聊天内容
8 ?5 F* }, f1 Z: @# u% I- |user_rso.onSync = function (){# Y$ C+ Z; C4 g" v
chatOutput_txt.text += newline+this.data.chatname +":" + this.data.chatcontent;
* r% d2 C( X/ R6 T, v6 W% e chatOutput_txt.scroll = chatOutput_txt.maxscroll+1;//确保最新消息能显示在输出框里
; u; w& ^! k" @7 f}9 `- H6 C6 e" @ G: T
//回车键发送聊天内容
! P! F7 _. \: H( x- d, n) B& k& ^: Nfunction myOnKeyDown() {
2 k O+ B8 v( @/ N+ l3 D if (Key.getCode() == 13) {
9 Y) V$ d& [- u& f( O7 J+ N' p. E if(chatInput_txt.text != undefined && chatInput_txt.text != user_rso.data.chatcontent){3 `- n) t* G+ ^' ~
Selection.setFocus(chatInput_txt);
# d2 D& D" e. u1 s& H user_rso.data.chatcontent = chatInput_txt.text;/ Z' x1 n, a$ t5 S1 ?
if(name_txt.text != "" && name_txt.text != user_rso.data.chatname){6 @; R; u [! ]+ W/ f! G
user_rso.data.chatname = name_txt.text;" C$ A* P1 x6 F8 p) {' o1 l2 ^
}
; z n% ]+ k# m# s1 S }
e/ Z1 r' W3 t }
. I9 a4 H% u6 ^0 H: r2 K}
3 K% U* f+ z: E9 B3 Xvar myListener:Object = new Object();
! i3 d" E9 j1 D1 h0 D( GmyListener.onKeyDown = myOnKeyDown;
2 H+ ?) t' z3 P. M+ |; `- T# TKey.addListener(myListener);; K& t& [( Q% m; l% F5 B
//构造检测摄相头和麦克风状态的函数
. ]6 Z4 _) T4 ^9 F/ j! g8 Afunction checkforCam_Mic() {
* J- {, ^9 Y- Q8 \2 t* ]1 E camArray = Camera.names;
7 u9 B% N! j+ ]( ]; _4 X- { micArray = Microphone.names;
3 B! I4 V s5 ?3 Y9 \% E if (camArray.length>=1) {
" w- E9 }, M0 N9 f# g# l- V1 D temp_cam = Camera.get();! X, }5 r$ p6 X! M; R$ s# W
if (temp_cam == -1) {9 N7 _# y+ Y! Y" N0 a% B3 u
camInfo_txt.text = '视频设备正忙!';
0 y" C5 e, G8 b2 g( z; b/ g. J camInfo_txt.textColor = 0xFFCC00;+ h- X# m5 @5 ]. o5 g+ K! y
} else {
* r; @% j2 [( b& t: W camInfo_txt.text = '视频设备可用!';
& ~! |2 e6 p$ r, [% z3 p camInfo_txt.textColor = 0x66CC00;7 A5 m4 Q1 ^( Q+ u( W
}
3 q2 B2 |$ `/ L5 h4 A# z6 r2 K delete temp_cam;; |; l! Q) g" x$ F* L" n
} else if (camArray.length == 0) {
/ y- @8 _4 K, w4 n4 \$ e camInfo_txt.text = '没有视频设备!';2 {- P/ f0 {6 [
camInfo_txt.textColor = 0xFF0000;
2 R. A" X3 E" t6 @) X }
( a. q: R# K4 N+ n% v9 s0 k5 ~7 k //检测麦克风状态
- P- ]9 H' Y* x- B& ?, @( v" Z if (micArray.length>=1) {1 U M) P d5 Z& c( N
temp_mic = Microphone.get();
D( m; m% Y G* g" U# h. Y( a0 t if (temp_mic == -1) {
# U P4 @* G9 S% k+ {4 m camInfo_txt2.text = '麦克风正忙!';3 I9 X4 {5 n. l3 i
camInfo_tx2t.textColor = 0xFFCC00;
) M/ X( F! c: N3 F) V$ t: C" v2 X# }& `+ \ } else {# j4 Z+ a" J$ d! w9 r. l
camInfo_txt2.text = '麦克风可用!';
. R: |) @. B* w/ _ camInfo_txt2.textColor = 0x66CC00;, `5 m3 I1 i; @$ ` w
}" Q" @) M; ~: E" M5 b
delete mic_cam;) K: g0 @4 n( ` c
} else if (micArray.length == 0) {( c7 i% \8 e( o1 f5 ~# p$ m
camInfo_txt2.text = '没有麦克风!';
) z/ D: A9 }# d camInfo_txt2.textColor = 0xFF0000;( u9 K h' A$ o" e9 C$ ?
}: Z6 m- h9 s5 v0 k6 E" }! V- N
}
5 d% F- d& K$ |. B P6 vcheckforCam_Mic(); |
|