|
|
只是把以前做的单个的功能整合了一下,本来还想弄个FMS的视频聊天,不过虚拟空间没办法../ M f4 J/ }) L
http://www.iphper.com/copstr
- X" l* T7 B. j0 N5 v光是留言板+在线涂鸦就几百行代码(看来效率低了点)
0 }3 L+ e6 Z4 S2 k2 P. {: ^. M8 A; ~ Y6 L
4 j- Z- C: s/ w6 G( u
FMS服务器的设置简单的仿照(一)就可以了,这段代码延续(一),加上了视频和语音发布,主要用到netstream.publish()方法,该方法也可以用于视频在线录制,除了检测摄相头和MIC状态的代码外,就增加了十几行的视频发布代码,有关摄相头和MIC的详细设置我并没有写,只是让大家看清楚它的工作原理,没有摄相头的朋友(我就没有摄相头)可以这样测试:打开麦克风说话,如果能听到回音就说明发布成功了
* v6 K; [1 T" W/ \% a$ n% @. h! g& a* M, K9 J: M* p; X! T4 ^
9 R7 n$ I! ^. M5 _
& w/ c# z! \, @! o' Z//建立与服务器的连接.
& G/ \! N4 x4 {, m) N Gvar sv_uri:String = "rtmp:/recordstream";
+ h, T& j" W% N; r" `var my_nc:NetConnection = new NetConnection ();5 t: B5 Z7 G9 M9 B/ f
my_nc.connect (sv_uri);
: X2 Y: S1 \- J; @% K//新建共享对象;
$ H8 o2 u! P" h& R2 Qmy_nc.onStatus = function (thisObj:Object){
9 Y* e3 @# Z9 N" T) w if (thisObj.code == "NetConnection.Connect.Success"){
( P2 R- H9 L2 o N! X info_txt.text = "连接服务器成功!!"; L c+ a' C8 W. X$ h+ {( b
info_txt.textColor = 0x66CC00;
7 ~ K2 w9 C/ ^4 ^ }
$ v2 x- C0 N% i& n+ C; y else{
; {7 N/ c" _( h& m* O6 M9 z info_txt.text = "连接服务器失败!!"# X% s" L* V/ r+ Y
info_txt.textColor = 0xFF0000;% b* G4 X- D$ A
}8 p9 A, X3 Y! z4 w
}
$ P% F/ W: W1 ]5 k) ivar user_rso:SharedObject = SharedObject.getRemote ("chat_rso", my_nc.uri, true);7 j& G# j* [. I1 d! J( Z* B
user_rso.connect (my_nc);2 S4 o0 N; C" ^; y, O
//建立摄相头和麦克风对象7 P$ t4 z" D& ^: U: H- R
this.cam = Camera.get();
# F1 n( J: q* K; d# y% ~+ i. Ythis.mic = Microphone.get();6 n% `; r% Z4 `6 E* I$ p4 H) U
videobox.attachVideo(this.cam);
0 d, S0 k4 ]. h# cvideobox.attachAudio(this.mic);: w0 h. d9 X4 |8 V& J
send_ns = new NetStream(my_nc);
8 `0 Q- [- p# N3 ]send_ns.attachVideo(this.cam);- R! b8 O6 h4 M& D( h7 t
send_ns.attachAudio(this.mic);
2 P6 A8 v* i5 F* ~4 wsend_ns.publish("humorguy");8 F# y. Z4 S: Q( [" N; R( m# X0 E
get_ns = new NetStream(my_nc);
% K9 p1 A3 c2 Q6 fget_ns.play("humorguy");9 ]) n, ]& C1 T: J
videobox2.attachVideo(get_ns);8 B( O/ d- w1 b: B7 ]: y
//更新聊天内容% X' N4 H1 W- N# R
user_rso.onSync = function (){$ B' J% G! m( l
chatOutput_txt.text += newline+this.data.chatname +":" + this.data.chatcontent;. a/ e6 X8 ^* z/ q/ E2 z
chatOutput_txt.scroll = chatOutput_txt.maxscroll+1;//确保最新消息能显示在输出框里
/ c) a3 M: L" W) E" e}
3 v- D+ v$ o( g$ ]' }# A! ]6 a//回车键发送聊天内容
1 Q+ i* T; z1 Yfunction myOnKeyDown() {
. h7 U9 e5 l# r1 T+ |, Q9 u if (Key.getCode() == 13) {
) d0 ]: v+ ^/ E8 @5 _* k# i if(chatInput_txt.text != undefined && chatInput_txt.text != user_rso.data.chatcontent){5 @8 ~) v( k) Q2 d- a! H& T
Selection.setFocus(chatInput_txt);
- d& b V2 `. P; } _1 [ user_rso.data.chatcontent = chatInput_txt.text;
( e# J5 h! m2 {0 b if(name_txt.text != "" && name_txt.text != user_rso.data.chatname){
2 }3 X6 n9 ~) S" i1 z1 U user_rso.data.chatname = name_txt.text;
- _, P# |: E0 V3 k1 v }
5 o9 |2 Q$ A& |6 [5 D! X- k4 M }
! G. T& r" `" P }- @ o3 [7 U& l& [' i
}
9 P& ], c/ [. x- a. j1 Pvar myListener:Object = new Object();
7 m! G7 ~! \# k+ D( W# M( w: [myListener.onKeyDown = myOnKeyDown;
5 C% s4 z8 }; h6 k2 y% ]- B8 eKey.addListener(myListener);7 v) {+ M. N5 }8 V9 @+ z) L
//构造检测摄相头和麦克风状态的函数" v; W) w* A( e: u9 b9 J5 L$ ~
function checkforCam_Mic() {
# _! O& k' c: q/ b camArray = Camera.names;& X' p5 X$ j0 r2 S0 R( C
micArray = Microphone.names;) @/ X0 h$ T) r& [
if (camArray.length>=1) {
9 i0 R2 W& H# ], i# `6 o/ Y temp_cam = Camera.get();" |& j0 J% a: Q9 { W/ `
if (temp_cam == -1) {0 u. }* Y( }/ G" k8 @
camInfo_txt.text = '视频设备正忙!';8 I9 q% Z# a2 }4 G
camInfo_txt.textColor = 0xFFCC00;
' g4 `; J. F) o/ I X } else {
- T' d0 i% e2 C7 s5 D0 L' M camInfo_txt.text = '视频设备可用!';( E; x E2 g8 I# n# w
camInfo_txt.textColor = 0x66CC00;' R& a8 a& t/ b4 `/ r
}0 L9 L0 x# l4 ?+ _6 l" x! w- f
delete temp_cam;
5 t3 G5 ~5 Z$ [) Q } else if (camArray.length == 0) {% Q( K. ~' V2 n1 l( t- K/ T2 z
camInfo_txt.text = '没有视频设备!';
5 I7 K) d: q& { camInfo_txt.textColor = 0xFF0000;" d$ A# e' ~9 t% v6 P* X% Z& G0 [
}
) Z3 M) @# a! t1 `9 } //检测麦克风状态 * n, u& Z; N+ b% g
if (micArray.length>=1) {
$ _: o5 i# z) | temp_mic = Microphone.get();
+ N j3 e2 x7 @1 i( P% t if (temp_mic == -1) {
( V; i' `+ L9 Z2 [, t camInfo_txt2.text = '麦克风正忙!';
% |& a9 a$ ~5 Q5 w0 a! h2 S% Q camInfo_tx2t.textColor = 0xFFCC00;
3 Y; N& ~4 x2 i } else {
; `, z* z7 T$ K Z1 f camInfo_txt2.text = '麦克风可用!';$ [; G; T* s5 m1 m F
camInfo_txt2.textColor = 0x66CC00;
0 M- `$ \5 x9 t }
: D" N/ i: v2 | ?5 I$ X delete mic_cam;' q% ^/ Q! {9 S
} else if (micArray.length == 0) {
) {$ j! v, k+ S% E% R camInfo_txt2.text = '没有麦克风!';
. ^ W6 B( L/ x6 z- [; g2 G3 }& P# a camInfo_txt2.textColor = 0xFF0000;8 z# C: f) {) |" p$ v- F
}
8 X2 G2 h5 `' \; ]}3 i7 J! v7 }8 C( a, ^4 B# ] F
checkforCam_Mic(); |
|