|
只是把以前做的单个的功能整合了一下,本来还想弄个FMS的视频聊天,不过虚拟空间没办法..3 E% F* f: l. I* ~
http://www.iphper.com/copstr
5 f. h) o! A5 r3 @! e, O光是留言板+在线涂鸦就几百行代码(看来效率低了点)! P' M: A9 Z0 B6 l( p. n: V
8 _4 r2 S3 r- l+ [$ u. w7 x% I3 `& j1 o& l& C
FMS服务器的设置简单的仿照(一)就可以了,这段代码延续(一),加上了视频和语音发布,主要用到netstream.publish()方法,该方法也可以用于视频在线录制,除了检测摄相头和MIC状态的代码外,就增加了十几行的视频发布代码,有关摄相头和MIC的详细设置我并没有写,只是让大家看清楚它的工作原理,没有摄相头的朋友(我就没有摄相头)可以这样测试:打开麦克风说话,如果能听到回音就说明发布成功了
C! w8 H( B9 z# }4 r) r
4 |" K/ g: Z0 w9 o7 Q, M" }3 G: T1 d1 I% w S! ^) A9 V8 y, s
2 v4 w, ^, \* ]2 ?//建立与服务器的连接.
; e: T! P9 }, F+ b. r( b2 Wvar sv_uri:String = "rtmp:/recordstream";
4 ?- Q" N Z0 T( d, O- u# Q9 t& }var my_nc:NetConnection = new NetConnection ();6 F' A( G/ u+ Q' _5 `% B
my_nc.connect (sv_uri);* q/ ^5 o d0 Q |. u( N: T9 n
//新建共享对象;
0 c8 F/ o7 r4 p9 V4 x1 c7 N7 Fmy_nc.onStatus = function (thisObj:Object){
8 _+ w: d- z8 B3 T if (thisObj.code == "NetConnection.Connect.Success"){
% J( C# b3 r6 S4 [7 m6 k8 R info_txt.text = "连接服务器成功!!";3 M( l( V4 g8 X2 t" I6 L9 O
info_txt.textColor = 0x66CC00;6 E9 E/ p6 s& d% ~9 I
}% {2 A7 V" G0 D( P P8 r
else{' T! B2 C0 X& ]" e" N3 K
info_txt.text = "连接服务器失败!!"+ D3 c6 |( I, Y
info_txt.textColor = 0xFF0000;
; g) m7 M' C2 i& p, s) q& u }
8 K7 S! O, X0 g4 ~. u}( G' k8 b& N X9 t8 `+ d
var user_rso:SharedObject = SharedObject.getRemote ("chat_rso", my_nc.uri, true);
8 z& M; d! B: H7 Iuser_rso.connect (my_nc);
5 m* a# b+ \9 U' e6 U4 q//建立摄相头和麦克风对象
: @4 y+ d5 V) P) d/ i+ t" {3 hthis.cam = Camera.get();! D7 z3 t# m: v z$ f5 s
this.mic = Microphone.get();
7 a! x2 i+ _5 B. t" yvideobox.attachVideo(this.cam);
7 s) @5 l6 V) h1 evideobox.attachAudio(this.mic);
$ |2 U7 v& V% ~5 w2 J6 Y" psend_ns = new NetStream(my_nc);9 V3 D+ n6 _- M5 @! N9 w
send_ns.attachVideo(this.cam);
% x/ \$ \3 `- Q# _; R% Psend_ns.attachAudio(this.mic);* Y6 U" H' {, Y2 ~: D
send_ns.publish("humorguy");) _8 j6 P6 z' B4 }1 d
get_ns = new NetStream(my_nc);' y6 O4 M1 z% Z% @/ f2 J
get_ns.play("humorguy");( `5 Z% J4 h( i b5 |6 G6 U
videobox2.attachVideo(get_ns);
7 c1 U. p7 B H' R4 g& |//更新聊天内容# ^ h! |9 {$ r \0 @* H' H" _
user_rso.onSync = function (){
0 x) ?( j7 W' a) B* G ?( R chatOutput_txt.text += newline+this.data.chatname +":" + this.data.chatcontent;; w. C9 R% Y" }! I* L% _, ]( S+ B
chatOutput_txt.scroll = chatOutput_txt.maxscroll+1;//确保最新消息能显示在输出框里5 r/ K$ |# V) Y- \9 `
}/ Q' f: ?* h+ @5 D* ?7 U9 @4 _% A
//回车键发送聊天内容; | z& z5 ^: t( ]4 W3 N) N8 {. x- |
function myOnKeyDown() {3 M( u g5 ~. `. M6 {% N: X
if (Key.getCode() == 13) {
# ]. D3 {; X6 @. Q7 c& A if(chatInput_txt.text != undefined && chatInput_txt.text != user_rso.data.chatcontent){ W: b: F% W% q
Selection.setFocus(chatInput_txt);
! N+ w/ R3 }2 D# @ Q" ? user_rso.data.chatcontent = chatInput_txt.text;
4 T5 G7 Q3 \" G3 e6 k& G if(name_txt.text != "" && name_txt.text != user_rso.data.chatname){1 O7 h0 `( t/ c7 M/ `+ T% T
user_rso.data.chatname = name_txt.text;* i( V, H# N: M; K1 u: C4 u
}
( ~" { @4 ~, V }
( R& x& k6 C. h/ b5 j! @4 ]" F8 H }
7 j5 Q* `- l* V2 K) U; f}
. x. M4 L; g G% ^% k6 f' h- e! yvar myListener:Object = new Object();
6 {& |0 K+ d. f1 p8 K# r" z9 RmyListener.onKeyDown = myOnKeyDown;) z+ |7 T f9 ?7 A: l
Key.addListener(myListener);$ K2 {" N, x+ h7 o
//构造检测摄相头和麦克风状态的函数
- s. z# P- ?, \7 _9 U t( ^2 A2 l/ \function checkforCam_Mic() {
7 V8 H2 m: k# w9 n% W camArray = Camera.names;' u L/ d8 ]9 ~* g1 J
micArray = Microphone.names;
! J2 Q# O; q# W if (camArray.length>=1) {! W s& P! J' e. @
temp_cam = Camera.get();
$ T, N8 h x+ _- w if (temp_cam == -1) {
; _6 T) D; @2 O, v! d, W; E camInfo_txt.text = '视频设备正忙!';0 {' w+ G/ J4 O1 j6 |7 U
camInfo_txt.textColor = 0xFFCC00;$ J% @4 R! f6 D# e1 Z+ I
} else {
9 \( U6 n. p! f0 f* a camInfo_txt.text = '视频设备可用!';
~: v! }/ P6 I' r camInfo_txt.textColor = 0x66CC00;
. _& n! {. @8 L( j, X }$ p, M1 @ Y$ h0 [9 w
delete temp_cam;
2 i2 X4 g! | u4 m' G6 m, D } else if (camArray.length == 0) {
& T; s2 J# q( a! b) X camInfo_txt.text = '没有视频设备!';
" @5 Q4 d, ?% A" }& `0 }: z& u camInfo_txt.textColor = 0xFF0000;% ~7 }- d3 u: Z: T: Y4 B
}2 k; I% q! X) U" \- P `; g. |# G
//检测麦克风状态
0 k" C; {. g3 T$ ^ if (micArray.length>=1) {& R1 h8 x# b: |! y5 T+ k
temp_mic = Microphone.get();8 N: g" t/ Q+ e! g+ ?
if (temp_mic == -1) {
/ P/ y& Y! [1 p4 b camInfo_txt2.text = '麦克风正忙!';: r$ u# v* l, A* q. N0 ?" R
camInfo_tx2t.textColor = 0xFFCC00;
R2 A" ^* w' u5 x1 ^& u* Q } else {% f! I; Q$ p0 [9 X( L0 f2 m! p
camInfo_txt2.text = '麦克风可用!';1 Q$ z% `$ O+ d) G
camInfo_txt2.textColor = 0x66CC00;, ?- L4 B- y: B: h
}
+ t% E7 N! O) ?1 M. M0 C delete mic_cam;
+ B2 F1 } U, N' h; d' t- \ } else if (micArray.length == 0) {
! |) Y/ d) k) w) j; t camInfo_txt2.text = '没有麦克风!';$ E0 r- [0 |( [7 W
camInfo_txt2.textColor = 0xFF0000;
6 V& |! V: H+ Y6 [' M }
/ [4 c. b$ q! d/ D/ i9 ?8 ], v}
1 ]/ _: i4 ?0 hcheckforCam_Mic(); |
|