|
|
只是把以前做的单个的功能整合了一下,本来还想弄个FMS的视频聊天,不过虚拟空间没办法..
* g9 K5 Q' |8 B1 n/ G3 {http://www.iphper.com/copstr
8 g1 D$ q+ ~% C% I. v" e9 }光是留言板+在线涂鸦就几百行代码(看来效率低了点)" H2 L3 K F6 s8 ]6 Y% o
9 D: h+ U( V) v0 L8 r2 M
" N6 @6 Y2 Q, g% L+ a' zFMS服务器的设置简单的仿照(一)就可以了,这段代码延续(一),加上了视频和语音发布,主要用到netstream.publish()方法,该方法也可以用于视频在线录制,除了检测摄相头和MIC状态的代码外,就增加了十几行的视频发布代码,有关摄相头和MIC的详细设置我并没有写,只是让大家看清楚它的工作原理,没有摄相头的朋友(我就没有摄相头)可以这样测试:打开麦克风说话,如果能听到回音就说明发布成功了
6 m* B% J& u# Z& |+ d, L3 s' z7 T1 F, e% O+ T' s& L# N/ E
- ^2 j- M+ k6 H1 E' r7 m, l
: Y1 ^3 E& }2 m//建立与服务器的连接.
9 `0 E# X6 b s {( J: fvar sv_uri:String = "rtmp:/recordstream";( P- W% v2 e' r2 [
var my_nc:NetConnection = new NetConnection ();
; R b) W0 W5 o; e. f1 ]; z: Nmy_nc.connect (sv_uri);
! M% u4 M* M+ I0 F//新建共享对象;
$ Y" e7 \7 a% k! Y& R: ~/ r/ qmy_nc.onStatus = function (thisObj:Object){
) k+ f1 N! D2 [ if (thisObj.code == "NetConnection.Connect.Success"){
0 T: i q) A. v' R1 Y( ~ j info_txt.text = "连接服务器成功!!";+ Z7 J* J& |5 }. _6 t2 K2 m
info_txt.textColor = 0x66CC00;7 w( {* c2 @$ `. E
}& V: G& a9 ^5 k
else{
5 J7 I0 Y/ ?: n9 a: D info_txt.text = "连接服务器失败!!"
6 }$ V( ~1 t9 a! K/ W; ? info_txt.textColor = 0xFF0000;# ~7 ` c! x& H: S8 x
}" x. E$ x+ m' B( x3 V' A; w' ?, j
}
+ }. _1 z: k3 x/ N3 _var user_rso:SharedObject = SharedObject.getRemote ("chat_rso", my_nc.uri, true);
+ P/ E& h0 T2 X: T- Luser_rso.connect (my_nc);
1 v9 n P7 ]/ q) |//建立摄相头和麦克风对象% m% K+ x; m( g9 M, F% M) p; W) ^
this.cam = Camera.get();
/ V3 b2 U' y! N9 K+ K/ u" ^/ F' Uthis.mic = Microphone.get();, q4 S, K$ Q+ f* v% c, [
videobox.attachVideo(this.cam);
$ U$ C0 W: f- ~& P# v" C- }, \. `videobox.attachAudio(this.mic);
& h6 {! L& n0 lsend_ns = new NetStream(my_nc);9 w! D$ @- F) M9 G- b
send_ns.attachVideo(this.cam);
9 }6 J& z; j" h+ j" | C0 wsend_ns.attachAudio(this.mic);
# d3 w0 a; _4 v5 @1 xsend_ns.publish("humorguy"); g* C" u' I& r% T/ `& p5 ?
get_ns = new NetStream(my_nc);3 }. N, X- e1 n5 S$ O1 \1 I
get_ns.play("humorguy");
Z. s/ x0 m' ^# [) t5 Wvideobox2.attachVideo(get_ns);, B# v8 V8 r( K w
//更新聊天内容
# T) \# k+ C9 a7 q6 G; y/ cuser_rso.onSync = function (){" P9 K$ j5 e" P2 v, n$ |
chatOutput_txt.text += newline+this.data.chatname +":" + this.data.chatcontent;
( w! z* Q& S9 ?, z0 f% g chatOutput_txt.scroll = chatOutput_txt.maxscroll+1;//确保最新消息能显示在输出框里3 o& U f3 ?0 N. t) P
}
3 N x1 B9 u7 ^//回车键发送聊天内容; s2 e9 |% s6 y0 C5 C
function myOnKeyDown() {$ |! n2 m! ]5 T2 y
if (Key.getCode() == 13) {4 l0 u% I! q" B% E
if(chatInput_txt.text != undefined && chatInput_txt.text != user_rso.data.chatcontent){' {: a( N4 @" \1 G' _5 o- u' G: m, }
Selection.setFocus(chatInput_txt);! |9 S2 ?, @' i: o/ A
user_rso.data.chatcontent = chatInput_txt.text; ]5 P9 [% E" z8 ?2 f
if(name_txt.text != "" && name_txt.text != user_rso.data.chatname){
+ F7 W" S4 ~1 Y# [+ S1 _, i0 H user_rso.data.chatname = name_txt.text;
" R; ?' b1 g0 }: K; c. C- R }* K6 o- F$ o, t, ~2 S1 E* H
}
2 n) ?) F9 o, C. I& ~; L6 t% H! t }
. m9 q6 c3 |4 `3 @}
# F2 O1 I" |, ^% |( S' r0 Ivar myListener:Object = new Object();
7 b4 X) D. U i5 k7 ?% h6 a0 NmyListener.onKeyDown = myOnKeyDown;6 g6 I" F4 Q- {; [
Key.addListener(myListener);) l" s5 [ X7 T0 {; C- ~% C) X
//构造检测摄相头和麦克风状态的函数- _9 [% }3 Z1 G: f7 r r3 J
function checkforCam_Mic() {
4 K+ w- h1 m( H4 I4 M camArray = Camera.names;0 ~5 s2 _! m" B
micArray = Microphone.names;
) O$ o6 Z) d/ y if (camArray.length>=1) {( z9 K$ C7 Z* E
temp_cam = Camera.get();) ?7 L+ v. q3 Z5 t5 q e
if (temp_cam == -1) {
$ \; m0 y6 S5 o7 b, k camInfo_txt.text = '视频设备正忙!';
8 z8 K+ w8 h) `# F5 d8 t& m( X camInfo_txt.textColor = 0xFFCC00;
, w5 W/ K; b8 k, w7 [ } else {# U1 e6 Q2 i* @! Y2 a! M0 b
camInfo_txt.text = '视频设备可用!';/ S1 I6 B& B5 R# h5 B
camInfo_txt.textColor = 0x66CC00;( J2 ]6 X1 Q/ F) M& d( j
}2 L3 V& d) P4 l% B- }# b
delete temp_cam;5 o7 p% _: T0 w! @
} else if (camArray.length == 0) {. _4 p& b& q6 _2 R7 Z; w
camInfo_txt.text = '没有视频设备!';" F/ n( R. W# w9 `
camInfo_txt.textColor = 0xFF0000;
' V# P, }2 V8 j3 \4 W }7 Q6 o( f7 E# R4 j R
//检测麦克风状态
3 f0 X H, z" ^+ R* C$ P if (micArray.length>=1) {6 M4 g! k* b1 r( K0 x% @$ N
temp_mic = Microphone.get();1 U3 y8 r7 M( m% ^6 P2 R, ?& g% m
if (temp_mic == -1) {
+ F" D% a9 L1 x( F2 f& L5 J2 \ camInfo_txt2.text = '麦克风正忙!';
8 P* H! d/ D, E- U- B camInfo_tx2t.textColor = 0xFFCC00;
' Z. R) g) Q; j8 L0 T" M% I# ~2 } } else {( [6 `5 \% {3 O8 `
camInfo_txt2.text = '麦克风可用!';
$ q! ?7 h* i7 ?- f- P; l+ F7 | camInfo_txt2.textColor = 0x66CC00;, P5 D$ `# A, w
}! W% E/ B: X9 O! W
delete mic_cam;
' s' V4 F2 @( a% `; w } else if (micArray.length == 0) {
; W1 r0 r R& X3 [ camInfo_txt2.text = '没有麦克风!';2 V* K" ]1 F5 _
camInfo_txt2.textColor = 0xFF0000;5 |( I% F4 Y, `6 F; ?3 E% g
}
5 r4 { G7 P- H# [# c9 u5 S" d}0 _5 q) E/ \1 k) U5 a
checkforCam_Mic(); |
|