|
只是把以前做的单个的功能整合了一下,本来还想弄个FMS的视频聊天,不过虚拟空间没办法..
9 H( S5 N+ |% {; d- x0 h3 r2 Z& ihttp://www.iphper.com/copstr, Z# C# V. I' f( N7 V$ b
光是留言板+在线涂鸦就几百行代码(看来效率低了点)! K; E2 r9 [* \
2 p, o4 l3 U8 L/ B) a8 U$ s7 h$ T2 x, l1 D4 E) D* u/ J; W- U
FMS服务器的设置简单的仿照(一)就可以了,这段代码延续(一),加上了视频和语音发布,主要用到netstream.publish()方法,该方法也可以用于视频在线录制,除了检测摄相头和MIC状态的代码外,就增加了十几行的视频发布代码,有关摄相头和MIC的详细设置我并没有写,只是让大家看清楚它的工作原理,没有摄相头的朋友(我就没有摄相头)可以这样测试:打开麦克风说话,如果能听到回音就说明发布成功了
# S' M! [& |: c% _4 v* K3 a5 M( n2 T7 H) T( D- R
5 I6 L0 p- W2 [
' a: M+ i4 H( |
//建立与服务器的连接.
+ c7 E4 q8 L5 \+ Uvar sv_uri:String = "rtmp:/recordstream"; K0 p/ n( x! A* P. `& V$ q
var my_nc:NetConnection = new NetConnection ();
$ f7 J, `; N- d7 x- y4 ^7 s, xmy_nc.connect (sv_uri);
6 w0 S' p; e6 y//新建共享对象;
/ k% }0 F( P' z7 i9 o9 Qmy_nc.onStatus = function (thisObj:Object){' a9 @- w9 P2 H0 Y* V6 B* c
if (thisObj.code == "NetConnection.Connect.Success"){
" I f5 u. o- b+ \+ g( M info_txt.text = "连接服务器成功!!";4 R9 |8 |2 Q+ S8 |, a0 n& Z
info_txt.textColor = 0x66CC00; x, ^/ R- Z% |5 P( J( W1 { t8 O& }
}
' ?2 g- b0 g! L: @9 ]3 j. ^0 ? else{
- ?1 u- ]* `$ c$ j info_txt.text = "连接服务器失败!!"
, m& P$ H: j0 \+ j6 S( ~9 n3 o: { info_txt.textColor = 0xFF0000;) A$ O/ m& ?6 ?$ r' V4 H6 i1 [" w
}5 T4 A4 R$ w7 n0 x% X) J
}
+ M5 i: H+ }* [7 g6 c% d! gvar user_rso:SharedObject = SharedObject.getRemote ("chat_rso", my_nc.uri, true);
# {) W9 |8 g6 |3 kuser_rso.connect (my_nc);
H" g% Z$ T) j5 x+ m//建立摄相头和麦克风对象2 p( ^2 a. C5 c+ G7 @7 t8 J
this.cam = Camera.get();
4 \) B- t* f7 s' K1 Y1 Z8 |2 Tthis.mic = Microphone.get();' i, P3 P8 l, h, F6 c
videobox.attachVideo(this.cam);
6 e8 w: d; o& {videobox.attachAudio(this.mic);+ t5 Q& ]( E3 b9 s e: L+ \
send_ns = new NetStream(my_nc);! V- S; p7 V, \& {4 T% B% @3 e
send_ns.attachVideo(this.cam);
, O' J1 P" ]& b; b& H! c3 f7 Qsend_ns.attachAudio(this.mic);
3 Z3 l# G+ g% v* m2 ]: r' csend_ns.publish("humorguy");
4 z7 _* o$ w% v: V. dget_ns = new NetStream(my_nc);
" I2 G" a0 j5 ?8 Iget_ns.play("humorguy");& r7 {2 R% z7 s5 U. [/ b
videobox2.attachVideo(get_ns);( G v8 p& H1 p0 g2 d; L; t6 x" q
//更新聊天内容6 s& {( ~- i% [: L, S; H- Y
user_rso.onSync = function (){4 x+ Y+ f. x, }
chatOutput_txt.text += newline+this.data.chatname +":" + this.data.chatcontent;# A4 v0 r! Y D2 {7 J; d
chatOutput_txt.scroll = chatOutput_txt.maxscroll+1;//确保最新消息能显示在输出框里% T. ~. t. S; d/ c* ?
}; Q- t" K/ v+ S$ B$ L
//回车键发送聊天内容
. F4 j7 T) m: hfunction myOnKeyDown() {$ E" q5 p( q1 {" o1 P
if (Key.getCode() == 13) {
: ]8 i; i1 p3 a$ b) r if(chatInput_txt.text != undefined && chatInput_txt.text != user_rso.data.chatcontent){
2 ?5 L f. T; d Selection.setFocus(chatInput_txt);" ^" E2 M# ~ t" t
user_rso.data.chatcontent = chatInput_txt.text;
2 [& ?2 @, q0 N- K, Y) e& h if(name_txt.text != "" && name_txt.text != user_rso.data.chatname){
1 c! U- s' K1 U/ d. m6 h user_rso.data.chatname = name_txt.text;
$ ^# @- r( e9 _ m }4 h2 E u9 s/ ~+ t& D7 @
}5 m# r9 ], X! W1 V
}3 ^5 D- L- ?- z5 ^9 l4 Q5 j/ ^
}* a6 ?1 h" ^1 N3 i- U- Y
var myListener:Object = new Object();
0 b& o' Y5 q% _! q O0 [myListener.onKeyDown = myOnKeyDown;
1 P% p% J8 g/ V5 @1 J# vKey.addListener(myListener);/ Q% p3 K/ V* L& |
//构造检测摄相头和麦克风状态的函数 P% C) ?6 V6 [5 E. w5 S2 Z$ d
function checkforCam_Mic() {4 p! X' z; @8 c1 l* w
camArray = Camera.names;! n, @2 o Q0 r
micArray = Microphone.names;
$ h8 o& a7 R1 \/ o if (camArray.length>=1) {5 D+ j' Y- W4 u* F
temp_cam = Camera.get();
- V9 J# r( C1 D; _: I if (temp_cam == -1) {
+ Z# G( |+ x& L1 J6 @ camInfo_txt.text = '视频设备正忙!';
9 l6 D" \) V; Z' ?, J+ }) r camInfo_txt.textColor = 0xFFCC00;5 X% P7 z% K! a6 t
} else {
7 I( b" o+ e6 S C- T- K/ I: ` camInfo_txt.text = '视频设备可用!';2 E- m( z6 n. s! T
camInfo_txt.textColor = 0x66CC00;
5 o* }( k' M+ r! \3 E4 J; m }3 E9 r# L; m' m8 C
delete temp_cam;
5 u0 S7 `, {) h0 A, p% k } else if (camArray.length == 0) {) S. X- z: S: p* S$ I W
camInfo_txt.text = '没有视频设备!';, Y0 i1 H! x9 I, ~
camInfo_txt.textColor = 0xFF0000;# \7 D, W! a% I( ?2 _
}4 b; X L6 p% ]* g# H
//检测麦克风状态
2 [2 |( ], V" {+ u/ H7 Z7 l2 \ if (micArray.length>=1) {
6 _- o# T, V* [3 Q' Y temp_mic = Microphone.get();
6 l, U4 G- j! T if (temp_mic == -1) {
" s: ]5 c0 N1 W: b" b( k6 X camInfo_txt2.text = '麦克风正忙!';+ R8 W- K- K8 h. n/ J
camInfo_tx2t.textColor = 0xFFCC00;" G$ t0 z# w& s9 ^& i
} else {
$ \* v0 E( m0 ?0 O+ ~5 U! U- D camInfo_txt2.text = '麦克风可用!';
, M# X, |/ F2 N7 z3 N camInfo_txt2.textColor = 0x66CC00;( N( z4 [% }. S
}9 ] ]6 g" u! P" ~% H9 o: |
delete mic_cam;8 W+ d+ p/ `9 F3 |! A0 {
} else if (micArray.length == 0) {
- L+ n# |- ~+ w- W) I( _ camInfo_txt2.text = '没有麦克风!';
! M- o! }- Z9 y: _6 c& k# g camInfo_txt2.textColor = 0xFF0000;! u- c6 c1 f7 ~8 T5 X5 S
}* S6 Q8 s! }( `) L$ s" @/ s1 i4 {
}5 b' q0 u+ ^9 [7 N5 P
checkforCam_Mic(); |
|