|
|
只是把以前做的单个的功能整合了一下,本来还想弄个FMS的视频聊天,不过虚拟空间没办法../ {* v& ^4 ~( r9 W: c6 [
http://www.iphper.com/copstr2 X0 y: x. |9 G" `4 l, ?7 G
光是留言板+在线涂鸦就几百行代码(看来效率低了点)
5 l" Z! }( t% X7 U+ `8 w7 t
5 @7 x9 h+ |1 s* F( L6 ~. h$ E4 L+ t1 i1 v
FMS服务器的设置简单的仿照(一)就可以了,这段代码延续(一),加上了视频和语音发布,主要用到netstream.publish()方法,该方法也可以用于视频在线录制,除了检测摄相头和MIC状态的代码外,就增加了十几行的视频发布代码,有关摄相头和MIC的详细设置我并没有写,只是让大家看清楚它的工作原理,没有摄相头的朋友(我就没有摄相头)可以这样测试:打开麦克风说话,如果能听到回音就说明发布成功了) }- w6 b/ l' L: Y, b5 B6 B# s0 ]5 Y
G4 G) S# ?' _2 I' y3 V' s" n
7 D/ X& a( F+ H4 B# P
4 U, d9 ~( t9 ]# S4 h9 E" D//建立与服务器的连接.
2 e! a3 v$ _- ]8 |% t% I Nvar sv_uri:String = "rtmp:/recordstream";
" d$ y; _0 h6 N4 o* B; {var my_nc:NetConnection = new NetConnection ();
* a8 ], E, h/ B; m0 ?my_nc.connect (sv_uri);! b" }) e$ Q1 h2 w6 H
//新建共享对象;
( S r* V# Q- ?; I; A umy_nc.onStatus = function (thisObj:Object){7 \" ]" K/ ?- n3 T
if (thisObj.code == "NetConnection.Connect.Success"){
/ K* @' m8 u9 F info_txt.text = "连接服务器成功!!";' n. I" U7 S+ W# w' Q4 D
info_txt.textColor = 0x66CC00;$ I2 e' ]7 O9 _0 v) c
}
6 W" A. v1 A0 {8 m, ?: s5 l5 Z4 F else{, n5 }9 W7 U4 y* W# g* E
info_txt.text = "连接服务器失败!!"
, \3 B: h: Q% N ?' k$ G info_txt.textColor = 0xFF0000;8 D+ {' ?* ^( G* u3 R0 ?* y/ ^2 q* U
}
# {' [9 y) U; @/ f}
2 C% {8 W* r" i# ~5 K) wvar user_rso:SharedObject = SharedObject.getRemote ("chat_rso", my_nc.uri, true);
4 v+ N: l9 l2 ]% c& K! k' Vuser_rso.connect (my_nc);, X, B$ P' a5 U) A! U' S
//建立摄相头和麦克风对象" G$ N" c1 U0 w4 i, K/ G
this.cam = Camera.get();
1 D2 q% f/ S- t/ bthis.mic = Microphone.get();
! e- N1 V6 U' u% R, S4 l% cvideobox.attachVideo(this.cam);
8 _+ u% s7 [3 O3 B: qvideobox.attachAudio(this.mic);/ e* K8 Y. B# A1 `
send_ns = new NetStream(my_nc);/ a5 F% Q$ L* T! G% l$ Z( }" c
send_ns.attachVideo(this.cam);% k) S' F3 n! g8 D4 `, Y5 c' y+ K
send_ns.attachAudio(this.mic);
0 G! Y( n% r. N* e# c3 x! {send_ns.publish("humorguy");
! J1 x- b/ |4 }! r7 Fget_ns = new NetStream(my_nc);
5 G( f8 l; z7 _get_ns.play("humorguy");
/ k5 x8 V) t; J" S; J' b& J: ^. |5 `videobox2.attachVideo(get_ns);
8 Q+ Q+ K7 J- Z2 m% u: f1 N% R6 y//更新聊天内容" H) k3 o7 E( M4 d/ z* T
user_rso.onSync = function (){
d+ C! Z& \8 L8 m3 Q chatOutput_txt.text += newline+this.data.chatname +":" + this.data.chatcontent;+ c) z6 Z) j& C) Z. y
chatOutput_txt.scroll = chatOutput_txt.maxscroll+1;//确保最新消息能显示在输出框里9 w0 n8 V! k% y, | X. ^7 R
}0 Q0 o( Z' k# _" @
//回车键发送聊天内容
% P3 L9 W4 N" Vfunction myOnKeyDown() {
$ R3 x+ r* s4 ?- M if (Key.getCode() == 13) {( L2 d( W6 r8 M( V- v
if(chatInput_txt.text != undefined && chatInput_txt.text != user_rso.data.chatcontent){
; y9 ^3 x W% ?- S. R3 f3 t5 N/ d Selection.setFocus(chatInput_txt);
1 w7 }. J, Y4 Z! E- e user_rso.data.chatcontent = chatInput_txt.text;
5 g! f) R" f9 q if(name_txt.text != "" && name_txt.text != user_rso.data.chatname){
$ C+ m# W5 y* X; F- ]: h+ U) L2 k4 S user_rso.data.chatname = name_txt.text;* Z1 ~. A3 l: r5 S* [
}# u+ x3 _+ v+ k, y
}
# E# g& }! `; x% \( F# E& r y0 {: P }5 J/ `9 a; ?& I& a: b: |
}7 Q1 \3 E* H+ N
var myListener:Object = new Object();
( l# [' V4 ?1 ~, }7 w/ WmyListener.onKeyDown = myOnKeyDown;
( S k& K0 W# |# f4 H$ u# @) yKey.addListener(myListener);
- r; b+ w5 m* D4 n//构造检测摄相头和麦克风状态的函数% K M/ x# o5 |9 \9 r
function checkforCam_Mic() {
" Y( E w# x. z5 r3 ?' R+ }& U) D camArray = Camera.names;
( c. N( \3 J8 Y* C* m6 f8 E micArray = Microphone.names;( L9 Z2 K0 x5 A3 `4 |- c5 h
if (camArray.length>=1) {
, u" [( I; H% y temp_cam = Camera.get();
+ C% T* D3 C6 j0 U7 @ if (temp_cam == -1) {
/ O2 Z& R, \! D camInfo_txt.text = '视频设备正忙!';
) F' d7 w( U! f, G/ y camInfo_txt.textColor = 0xFFCC00;9 e( t [! U: b7 t
} else {' k. K) t9 {" Q4 I
camInfo_txt.text = '视频设备可用!';" K* q2 @7 y0 w# {$ [4 P0 A! R
camInfo_txt.textColor = 0x66CC00;2 h4 k0 O+ v l+ O
}
+ m; U' d2 i5 N delete temp_cam;, a6 [! @2 J) Y4 v
} else if (camArray.length == 0) {
& ~$ r; A: v j# W0 F camInfo_txt.text = '没有视频设备!';
6 B& R" R/ K' Q9 d# k camInfo_txt.textColor = 0xFF0000;
) z4 h$ ^4 |: G+ L) L }
& E: w6 m2 S0 t8 r, L3 p //检测麦克风状态
! f- x$ R% T3 m/ Z1 e if (micArray.length>=1) {. V9 L8 ^* B$ j/ J0 M) G
temp_mic = Microphone.get();
8 R: X* s( m9 h1 J if (temp_mic == -1) {+ c2 D" `* N L
camInfo_txt2.text = '麦克风正忙!';* c f- L% p- t& U2 l: {, B$ e
camInfo_tx2t.textColor = 0xFFCC00;
. ?" b+ F7 Z% Y, k+ y$ x8 i7 ] } else {9 g5 v/ R" k$ R6 d4 l, G
camInfo_txt2.text = '麦克风可用!';
+ U; @2 b, s* |6 Y: b: S camInfo_txt2.textColor = 0x66CC00;* X: |9 _# L1 n) R% L( S @* R
}5 n) d$ Z4 F0 A% I2 P4 u
delete mic_cam;# F6 P- R* p, Z
} else if (micArray.length == 0) {" \4 F5 `6 H( \% {5 x6 }( R9 l) Y
camInfo_txt2.text = '没有麦克风!';: ^1 o5 S) u2 O9 F
camInfo_txt2.textColor = 0xFF0000;, b) j* M# \7 h. S9 t, f; ^
}" Y# o/ [# |- T4 t1 }/ h8 {9 v: |
}
2 _5 q, n5 r6 V% E( C: ~checkforCam_Mic(); |
|