|
|
只是把以前做的单个的功能整合了一下,本来还想弄个FMS的视频聊天,不过虚拟空间没办法..
. r p# N6 O9 f& G; X$ Xhttp://www.iphper.com/copstr; Q2 |( N3 j" I$ x1 M
光是留言板+在线涂鸦就几百行代码(看来效率低了点); z# l9 k) ~5 W1 n& r7 A! m
. p& r8 M6 J9 A7 X( M
0 i h& Z d1 A1 `FMS服务器的设置简单的仿照(一)就可以了,这段代码延续(一),加上了视频和语音发布,主要用到netstream.publish()方法,该方法也可以用于视频在线录制,除了检测摄相头和MIC状态的代码外,就增加了十几行的视频发布代码,有关摄相头和MIC的详细设置我并没有写,只是让大家看清楚它的工作原理,没有摄相头的朋友(我就没有摄相头)可以这样测试:打开麦克风说话,如果能听到回音就说明发布成功了2 t# j+ b+ i0 O
" {6 F0 h; W* R5 O8 Q3 Y/ Q+ J! e4 U/ m* q3 ~- z
! J. w; o$ |4 a
//建立与服务器的连接.3 x( `8 m5 J. {: z- j2 x. n ~4 K+ a
var sv_uri:String = "rtmp:/recordstream";) _! |; H2 a1 D
var my_nc:NetConnection = new NetConnection ();
- ^' X3 ]3 C2 {" B1 y! }! wmy_nc.connect (sv_uri);
: a e# V/ A6 {8 U5 V+ `//新建共享对象;
K$ Z7 o* g t9 |! Vmy_nc.onStatus = function (thisObj:Object){1 y; H9 s- N- l9 Q q
if (thisObj.code == "NetConnection.Connect.Success"){
2 I' T+ E2 F4 M4 u& a info_txt.text = "连接服务器成功!!";
7 r9 p2 m: `5 e3 ~: r7 ]. ?1 C info_txt.textColor = 0x66CC00;5 q+ G8 Z; Y6 B! `8 R. C: J
}
$ a/ y1 z6 [7 W6 C9 D else{
5 |4 \. r' ]8 G2 a" F info_txt.text = "连接服务器失败!!"
" n- o5 z6 q1 r: P1 `: O5 u+ |. y info_txt.textColor = 0xFF0000;$ N# v3 B3 E+ I' H% [/ ~+ K5 I& r. P
}
9 R& o. [& K' o% @% v4 S' r+ G1 D}" ~" m1 n4 ?3 t% _ F- w
var user_rso:SharedObject = SharedObject.getRemote ("chat_rso", my_nc.uri, true);# k0 T/ f, g4 b
user_rso.connect (my_nc);
* I# U& d [7 t {. D- o* @9 Y, s//建立摄相头和麦克风对象
$ k( D4 Q8 L* e9 d1 tthis.cam = Camera.get();+ p6 X2 C. h1 Q) h, @
this.mic = Microphone.get();
+ }4 z, H( \3 M6 c) U8 Nvideobox.attachVideo(this.cam);
; `- M* @3 K& ~( Y2 fvideobox.attachAudio(this.mic);
' z' f2 O! X) y8 z$ A, c" G2 isend_ns = new NetStream(my_nc);
1 A/ A+ u. s, P+ Z* H2 I0 B/ E5 Zsend_ns.attachVideo(this.cam);0 o; ]; a/ f% o% m. ~0 J- V
send_ns.attachAudio(this.mic);
, G4 R7 ^. k. D6 e0 H# Y# Fsend_ns.publish("humorguy");
5 e( S+ b" M; Qget_ns = new NetStream(my_nc);2 K ^( ], A$ c& L% Y9 K' J4 \& t( n
get_ns.play("humorguy");
6 u. R3 J, ?5 ]6 I, Dvideobox2.attachVideo(get_ns);
; u5 `( v% { h! `//更新聊天内容% w# n$ F; m; P Q5 @9 t$ h: L
user_rso.onSync = function (){+ ], T3 q8 R9 q2 I2 o- M4 f
chatOutput_txt.text += newline+this.data.chatname +":" + this.data.chatcontent;
1 f- g2 _$ `3 N `- c1 p chatOutput_txt.scroll = chatOutput_txt.maxscroll+1;//确保最新消息能显示在输出框里
& I1 `; ]) D4 Q) L9 I}
. t2 C( f6 W9 }$ [+ ]+ I$ v+ B//回车键发送聊天内容6 L, F+ f. \- R/ I1 x7 T C# p
function myOnKeyDown() {
' E. V: F2 u" w if (Key.getCode() == 13) {
( }# W& Y: O) g+ |& \ if(chatInput_txt.text != undefined && chatInput_txt.text != user_rso.data.chatcontent){: g! M' S- b: G/ F. n) c
Selection.setFocus(chatInput_txt);7 v/ \9 I1 z7 m! r+ ?) U: A2 l
user_rso.data.chatcontent = chatInput_txt.text;
1 S: |: T1 v9 M7 U if(name_txt.text != "" && name_txt.text != user_rso.data.chatname){
' k2 J v) l, { user_rso.data.chatname = name_txt.text;
9 k3 ^& S8 u2 L: Z! f6 v }5 Z b' N/ {9 y
}+ B; M' P" j$ M) g# n- B9 V. q
}/ j4 @ X4 Q M% @, W. _. ~
}
* y2 g# S' K# hvar myListener:Object = new Object();
& ^4 M% R% X2 O( lmyListener.onKeyDown = myOnKeyDown;
1 f4 l' W" d6 v6 I" \Key.addListener(myListener);
6 a' c5 c) e+ U8 r, I) ~//构造检测摄相头和麦克风状态的函数. `' k: r( d( ]
function checkforCam_Mic() {& P# c$ Y& w5 h& W2 [
camArray = Camera.names;. W9 d9 t$ Y* R5 B( }6 ~1 \
micArray = Microphone.names; z$ o/ I" C5 Y4 j5 X$ K
if (camArray.length>=1) {
7 {* r" H/ T e I n0 ] temp_cam = Camera.get();. C2 S6 g' K: R0 I# X
if (temp_cam == -1) {- C# ^, O: |3 [8 j; b O6 w3 e
camInfo_txt.text = '视频设备正忙!';
, Y) s/ H! E2 f* z: w camInfo_txt.textColor = 0xFFCC00;
4 h+ E' u2 V8 s8 b } else {/ z- X8 O- ^" P! E
camInfo_txt.text = '视频设备可用!';
2 l' {5 g4 o! |7 v4 O1 e) f camInfo_txt.textColor = 0x66CC00;6 Y: [' J3 b+ H
}
1 K( G" L, Y4 x$ @' B9 z6 q8 E# Z delete temp_cam;* d% m: a2 P5 \2 `6 v
} else if (camArray.length == 0) {
8 _4 v9 k, \" J" U- _8 n; q camInfo_txt.text = '没有视频设备!';1 _; p$ `2 B) N# l& _
camInfo_txt.textColor = 0xFF0000;. R0 A! r$ t& U5 u% c3 s
}- W! l/ x* o3 y: t& J2 o
//检测麦克风状态 7 ~, E8 H0 }+ |$ e2 T
if (micArray.length>=1) {
, g. Z1 W3 B8 M temp_mic = Microphone.get();
2 f: P; ?% `+ T( U/ C3 l7 v if (temp_mic == -1) {" ^& F: s6 i3 N, c# F
camInfo_txt2.text = '麦克风正忙!';
! f$ Y" C2 P9 {, F8 G camInfo_tx2t.textColor = 0xFFCC00;
9 x5 S3 K6 V( h- Z } else {
7 D" F# I0 Y6 W1 K' Y# r camInfo_txt2.text = '麦克风可用!';) r* S/ V9 n3 R7 B p; {5 r
camInfo_txt2.textColor = 0x66CC00;2 L7 ?; ] u, B( z- R$ I6 b) U" q+ j
}+ O+ K5 d V7 M& z6 q3 K! V
delete mic_cam;
, D$ H' U! L3 Z3 V } else if (micArray.length == 0) {
" K! j* m# P) x camInfo_txt2.text = '没有麦克风!';9 f0 Q+ q+ h6 Z [$ c4 p1 T
camInfo_txt2.textColor = 0xFF0000;7 R4 x6 b' I$ Q6 R
}
/ F5 y, {2 S7 r' T/ B}6 ^3 P' J9 s1 T7 K, B% ]; a
checkforCam_Mic(); |
|