|
只是把以前做的单个的功能整合了一下,本来还想弄个FMS的视频聊天,不过虚拟空间没办法..! x b' |/ J* M0 Y& D
http://www.iphper.com/copstr0 u. `" U. m1 W7 B3 H, S( h
光是留言板+在线涂鸦就几百行代码(看来效率低了点)( h$ ^: r/ o3 E/ b, E
+ G3 {. [6 l' k
6 X9 C# x$ f) j/ y: Y. w
FMS服务器的设置简单的仿照(一)就可以了,这段代码延续(一),加上了视频和语音发布,主要用到netstream.publish()方法,该方法也可以用于视频在线录制,除了检测摄相头和MIC状态的代码外,就增加了十几行的视频发布代码,有关摄相头和MIC的详细设置我并没有写,只是让大家看清楚它的工作原理,没有摄相头的朋友(我就没有摄相头)可以这样测试:打开麦克风说话,如果能听到回音就说明发布成功了
B7 x$ m& c% ~& f8 X* t- C0 I+ o+ t6 R+ S
/ ]" c) `8 \- H% C/ {9 ~. Q/ x6 A9 R
5 k$ U4 W6 j% | b% C% b9 G$ ]: W0 g6 h//建立与服务器的连接.. J N% s" Y1 u2 W' p
var sv_uri:String = "rtmp:/recordstream";( Z7 K8 s+ K" {) F1 m
var my_nc:NetConnection = new NetConnection ();! ~* x3 l! G; i5 B, r
my_nc.connect (sv_uri);
+ h' G1 n, `% q; _; h' S' x//新建共享对象;
2 g0 i& _, I3 s6 gmy_nc.onStatus = function (thisObj:Object){3 x% s W8 i* F" n
if (thisObj.code == "NetConnection.Connect.Success"){
* }1 ?. Y' o) D info_txt.text = "连接服务器成功!!";0 _& Z# o6 I' |$ N
info_txt.textColor = 0x66CC00;9 O9 v+ G/ Q* j& }4 y3 Z
}9 a0 \% Y" Q e2 q2 p
else{ k8 R* U9 s* V9 o: i# _8 o. R6 z
info_txt.text = "连接服务器失败!!" s, @" ~4 M; B0 v
info_txt.textColor = 0xFF0000;
; B; l' M& P2 B x, N! B }
; S6 Q( c! N6 f( R}
, e3 [: v2 m) I. yvar user_rso:SharedObject = SharedObject.getRemote ("chat_rso", my_nc.uri, true);9 d& V! _) L' K3 j- ?) |' ~
user_rso.connect (my_nc);5 C* A: s7 a, A7 K$ l
//建立摄相头和麦克风对象* h5 P, P: |6 I: q/ s
this.cam = Camera.get();8 Y2 E* {& ?. d% \: Z- c
this.mic = Microphone.get();
8 L; k) T, d6 g! Kvideobox.attachVideo(this.cam);. I. ?4 v0 c1 G' `- \# ~6 Q* C+ y
videobox.attachAudio(this.mic);9 n7 T M- R' j* g9 ?) u9 _
send_ns = new NetStream(my_nc);! S3 ]5 m: u4 j, X: T, O; L
send_ns.attachVideo(this.cam);
) \/ k. Q5 a8 g4 p* esend_ns.attachAudio(this.mic);
# Y" Z7 ?% N- `6 T$ v5 lsend_ns.publish("humorguy");
, h. |: d. b" U! K; E2 u% |% oget_ns = new NetStream(my_nc);
" f( G" M3 y G# Bget_ns.play("humorguy");& I- }6 z4 a: I
videobox2.attachVideo(get_ns);
5 W& |2 Z( R2 T u8 b//更新聊天内容" @0 f& T' `( t; K1 }/ m1 l! G8 p) E4 P
user_rso.onSync = function (){
. o+ r& y/ w7 y, R2 w4 u: X chatOutput_txt.text += newline+this.data.chatname +":" + this.data.chatcontent;. `3 G4 ]& U; n- A1 m
chatOutput_txt.scroll = chatOutput_txt.maxscroll+1;//确保最新消息能显示在输出框里$ B# F' J0 w: w: }/ e- j& Q9 \, J
}
$ k- [1 Y5 ~% r/ r5 @5 w. }! P//回车键发送聊天内容
) ]" r8 x# p2 }" U) E7 T+ V) Wfunction myOnKeyDown() {: \) M- ^2 z' ~! W* B1 U
if (Key.getCode() == 13) {* i' L7 j- l) P& m" H
if(chatInput_txt.text != undefined && chatInput_txt.text != user_rso.data.chatcontent){
* ~8 y0 G" Q9 Y% s" p. S( s0 f Selection.setFocus(chatInput_txt);1 k. w# }% E! v" @: {( G' s6 M
user_rso.data.chatcontent = chatInput_txt.text;
4 E/ I2 G, Z- f9 m/ l2 i/ f" O9 c6 X if(name_txt.text != "" && name_txt.text != user_rso.data.chatname){
2 a/ ]8 }5 B) W, Q3 H& K user_rso.data.chatname = name_txt.text;0 c/ m' v2 ]7 E6 a4 ]
}
+ Y0 d. N9 P3 M! N }
! b$ f7 B7 E2 A }
$ k _" u( H9 T- M, t6 f* ]}
7 ], E2 S) V9 ^9 Ivar myListener:Object = new Object();6 h7 s/ v* t3 B; t/ {
myListener.onKeyDown = myOnKeyDown;
: W9 l5 B/ j% J& ~Key.addListener(myListener);
. g+ w$ X; `+ e1 B' C; a, y4 I% h//构造检测摄相头和麦克风状态的函数
. U* C6 X' j Z0 Z- ?; Ufunction checkforCam_Mic() {5 |' {2 C& ^5 c; V) g
camArray = Camera.names;0 l& ? J ?$ h. a7 k* _. V) l
micArray = Microphone.names;! @- T' b: _% ^5 ?0 J& {
if (camArray.length>=1) {6 B+ W5 V( F% [- s/ R: D: R
temp_cam = Camera.get();
' ]4 X i I0 R/ | if (temp_cam == -1) {; M, G. v6 x% R, e1 k- J
camInfo_txt.text = '视频设备正忙!';
) @) P4 ~: t* X7 d camInfo_txt.textColor = 0xFFCC00;
; {! R A+ e3 {1 N7 |+ S } else {7 g e% P; V: X. U) M- J' k
camInfo_txt.text = '视频设备可用!';0 u/ y* f; p$ \' L& i
camInfo_txt.textColor = 0x66CC00;
% k( g% F9 V8 X! ^1 ` }" \( u5 S( R' W% L
delete temp_cam;- [6 f3 w, ?$ u2 S1 X
} else if (camArray.length == 0) {. F o0 O. b# [# h& P+ K
camInfo_txt.text = '没有视频设备!';, U+ n2 N0 ?$ @- t! y x
camInfo_txt.textColor = 0xFF0000;
' R9 F$ F! _, u2 H/ n5 M. n }
; `) F: l/ e4 U6 U& C: r9 ~6 C( j //检测麦克风状态 - `& v$ ]# I* T. D+ b
if (micArray.length>=1) {
4 d' F* U5 P" u temp_mic = Microphone.get();
q* n$ _4 G1 }4 N if (temp_mic == -1) {
. |( g5 |9 X% @2 I camInfo_txt2.text = '麦克风正忙!';* s" z/ u6 L9 O! d; }$ B1 n1 n
camInfo_tx2t.textColor = 0xFFCC00;+ V4 h- w$ m" n. x8 i
} else {
2 ^- h, V" J+ W5 u' h+ K camInfo_txt2.text = '麦克风可用!';/ J% |/ b& A2 u
camInfo_txt2.textColor = 0x66CC00;1 C6 |5 s, Q3 U# z1 h. _3 U
}3 h* Z2 }. x5 {3 A' A$ z
delete mic_cam;) h- B3 Q8 o. X: A
} else if (micArray.length == 0) {7 u8 n# h h; C2 n
camInfo_txt2.text = '没有麦克风!';8 Q! Z" p* a6 w& A `/ q2 C6 ^
camInfo_txt2.textColor = 0xFF0000;, t3 N M- \2 f6 @+ a& w
}" K6 }- X( B% n5 Q7 }& z3 q
}
! f% c9 d8 o3 q0 q& e( tcheckforCam_Mic(); |
|