|
|
只是把以前做的单个的功能整合了一下,本来还想弄个FMS的视频聊天,不过虚拟空间没办法..
9 t+ P4 v) ]+ y6 E; d$ Y9 uhttp://www.iphper.com/copstr
! @0 M4 J. P/ }4 O光是留言板+在线涂鸦就几百行代码(看来效率低了点)
5 Q+ _( w8 F' ~; i/ J; D- G0 j" K2 q1 H4 s
, v2 {+ k% p6 N- l* U' hFMS服务器的设置简单的仿照(一)就可以了,这段代码延续(一),加上了视频和语音发布,主要用到netstream.publish()方法,该方法也可以用于视频在线录制,除了检测摄相头和MIC状态的代码外,就增加了十几行的视频发布代码,有关摄相头和MIC的详细设置我并没有写,只是让大家看清楚它的工作原理,没有摄相头的朋友(我就没有摄相头)可以这样测试:打开麦克风说话,如果能听到回音就说明发布成功了7 ]2 I5 o' i: q, ~2 e
: T) y) G: W' {+ Y; C1 V0 ?$ ~
: s3 n( O; x& {' k7 `$ }! m
0 p/ W- S# G2 \ |+ V2 \5 }0 p9 F//建立与服务器的连接.
9 k. P7 _0 ~8 l' Zvar sv_uri:String = "rtmp:/recordstream";1 O- F: \. O' e/ E1 q
var my_nc:NetConnection = new NetConnection ();8 x6 K4 E8 {9 w) ?, L$ R _7 N
my_nc.connect (sv_uri);
$ ]8 T4 X. M+ }3 k, k//新建共享对象;& E3 c) |( ^) ^, f1 \9 M Z
my_nc.onStatus = function (thisObj:Object){
9 v6 n2 ^9 `' i( Q if (thisObj.code == "NetConnection.Connect.Success"){4 z% z8 H+ b0 g) B3 v* s, s% k
info_txt.text = "连接服务器成功!!";
6 ?3 y% e, P9 C$ u: U info_txt.textColor = 0x66CC00;
: I9 ?. p3 |- }& U8 N }8 T" c8 J9 l0 B: f7 [$ R
else{2 W( F% w8 W3 C9 W R6 D
info_txt.text = "连接服务器失败!!"
% l. u# E& Z! m& n* m; L% R& \; C info_txt.textColor = 0xFF0000;
0 |" Q& c0 R f4 m# V7 v }, ]0 M( q9 F- T
}
( b! h0 Y5 M. ]var user_rso:SharedObject = SharedObject.getRemote ("chat_rso", my_nc.uri, true);4 w0 i# A, D3 W2 M6 g( J' B; O
user_rso.connect (my_nc);8 _' l8 B. M" [
//建立摄相头和麦克风对象2 t7 l, Z! ?4 v: q" M, V% p) k
this.cam = Camera.get();( a6 Y/ J$ p% K
this.mic = Microphone.get();
6 ^- H% q: o- ovideobox.attachVideo(this.cam);8 ^ r9 b9 v1 Y9 ~" Q
videobox.attachAudio(this.mic);
$ @1 z% l! @0 o5 h' w9 _ ?send_ns = new NetStream(my_nc);
- d9 Y* t) g& y4 d0 [. ~4 ]send_ns.attachVideo(this.cam);$ x6 N% y7 z$ N& M0 C. S
send_ns.attachAudio(this.mic);
7 o$ W' q& U/ G( ^6 ~send_ns.publish("humorguy");
/ w: `5 @; \) U, A, Sget_ns = new NetStream(my_nc);
' W' z) v% e9 n- {% hget_ns.play("humorguy");# A# o1 `. S; c# U+ b
videobox2.attachVideo(get_ns);
. k2 [4 @: a, @7 R4 e% \% F2 U//更新聊天内容
, x" N) I' L- o i: r- xuser_rso.onSync = function (){6 ~2 I4 ^' @" O3 y
chatOutput_txt.text += newline+this.data.chatname +":" + this.data.chatcontent;
1 c# S( H, _5 J- H7 R V chatOutput_txt.scroll = chatOutput_txt.maxscroll+1;//确保最新消息能显示在输出框里' L( ]$ F2 u# f3 {5 W
}8 I9 L- u, C$ a$ ~4 h1 W
//回车键发送聊天内容% N4 A8 U4 [/ n: P5 s
function myOnKeyDown() {! b. c# |7 V$ k3 M2 l7 o
if (Key.getCode() == 13) {
2 h s; q; d" o' a# z if(chatInput_txt.text != undefined && chatInput_txt.text != user_rso.data.chatcontent){' l5 [, w8 a+ \ g& j
Selection.setFocus(chatInput_txt);
3 o1 C/ a# z; m( j% { user_rso.data.chatcontent = chatInput_txt.text;8 r& Z' z2 t2 y7 I
if(name_txt.text != "" && name_txt.text != user_rso.data.chatname){
) W3 l0 v* l! t4 k' b user_rso.data.chatname = name_txt.text;
4 _4 e r2 U- F& @, ` }3 j( w9 d/ v) H3 m6 L
}( f4 b; G+ t/ ^9 M) o
}
9 H, K9 d* @5 l1 z& O; Z}
2 ^ q" r0 ]* E* C/ Zvar myListener:Object = new Object();, n5 ]0 F% {$ Y- q' u" `
myListener.onKeyDown = myOnKeyDown;
2 a3 \% x; \ \, N+ OKey.addListener(myListener);
4 G* i8 q8 }0 G+ T) t) s2 z0 O//构造检测摄相头和麦克风状态的函数" U3 t* a6 j4 H/ O, G; B
function checkforCam_Mic() {
9 ^+ y* z3 G7 m( [% n camArray = Camera.names;1 a4 o. i: `" m" z& G& j
micArray = Microphone.names;$ n4 n4 N1 G% [
if (camArray.length>=1) { }* X, j9 ^: R; A9 E: |1 G7 ?; ?% L7 L
temp_cam = Camera.get();3 k8 N. a6 n& r8 d( J( O6 h# z
if (temp_cam == -1) {
1 \6 W8 t" x2 |, V* r* b: P( R* o camInfo_txt.text = '视频设备正忙!';* ~$ b4 \4 r1 h7 Y \2 m# z
camInfo_txt.textColor = 0xFFCC00;& @$ s! q# H" ]- }# N. |
} else {
9 _& @/ C. o7 [) ~! D* `* D camInfo_txt.text = '视频设备可用!';8 o% K% o( v/ e2 y, ~' d! `4 P3 A
camInfo_txt.textColor = 0x66CC00;/ V: J$ E8 K9 Q7 `9 B+ c
}
9 t; `3 V+ e6 z- Q6 n delete temp_cam;
) H6 S9 C$ _1 B: |, O5 v } else if (camArray.length == 0) {
$ b v# D; o; t: V: k" D camInfo_txt.text = '没有视频设备!';
% m/ o, b1 Z; h6 @4 V* H camInfo_txt.textColor = 0xFF0000;
; G$ o/ c. ?5 G- O" Q$ D }/ L+ O, C' A6 u8 ^9 C- ~6 v
//检测麦克风状态 * _; R$ U! Q: P- L' ~
if (micArray.length>=1) {
) X: B, M V# ?3 _, i. M7 y3 J/ _ temp_mic = Microphone.get();% I) [; W# r$ a6 Y) y. B
if (temp_mic == -1) {+ u, n( J- s- R/ q
camInfo_txt2.text = '麦克风正忙!';# B3 E7 v$ b6 ]* X6 I* |
camInfo_tx2t.textColor = 0xFFCC00;
, S8 y' }& R& P7 G1 P9 y2 m } else {
% r+ `8 |3 T* m% W* p9 E% z c; } camInfo_txt2.text = '麦克风可用!';
5 l; p8 J+ s6 K v y" d' \' S- F O camInfo_txt2.textColor = 0x66CC00;
" c: e% Z# Z3 Y! e7 _ }
# w+ e& m0 V9 C, n. Z! p delete mic_cam;
) ~, I$ P; O5 m7 {& X% _2 }: F l" a } else if (micArray.length == 0) {5 H, n$ J5 C' E$ _4 v! d' i/ m
camInfo_txt2.text = '没有麦克风!';
6 b* Y$ ^9 R" W& z8 P* c8 Y( \ camInfo_txt2.textColor = 0xFF0000;
$ |6 K# V! |# K/ Z' H3 C# a. D }
4 p3 E( b' d, ?' N, g4 ]}6 u0 l5 N) g, e( C# c/ f5 @
checkforCam_Mic(); |
|