|
|
只是把以前做的单个的功能整合了一下,本来还想弄个FMS的视频聊天,不过虚拟空间没办法..
7 @. [6 w# o9 @; whttp://www.iphper.com/copstr
" g, ^6 Z5 [) F% {+ `7 o; n, m8 X/ K光是留言板+在线涂鸦就几百行代码(看来效率低了点)
' m5 i) \) Y7 O x6 J# G$ Y4 X
2 @# ^8 [' C% G) t; Y8 {5 Y( w3 b1 t- B7 {5 N8 l
FMS服务器的设置简单的仿照(一)就可以了,这段代码延续(一),加上了视频和语音发布,主要用到netstream.publish()方法,该方法也可以用于视频在线录制,除了检测摄相头和MIC状态的代码外,就增加了十几行的视频发布代码,有关摄相头和MIC的详细设置我并没有写,只是让大家看清楚它的工作原理,没有摄相头的朋友(我就没有摄相头)可以这样测试:打开麦克风说话,如果能听到回音就说明发布成功了
1 k) j L( O8 X* Z5 D5 C- L
# r8 R1 S3 N& {. U2 \2 _7 Q) U7 O1 l. X% a
. D3 Q9 y0 E$ w//建立与服务器的连接.
( D" ]' W u' t( kvar sv_uri:String = "rtmp:/recordstream";: s1 N9 x5 R$ z- q, f
var my_nc:NetConnection = new NetConnection ();
( i5 m9 } R' J% |( o% L& a1 U4 Wmy_nc.connect (sv_uri);9 \3 W; G9 M1 Z6 u
//新建共享对象; g7 m8 O8 z+ C& X8 a
my_nc.onStatus = function (thisObj:Object){
$ [ j5 _5 d8 j4 p( G q+ {+ V. n if (thisObj.code == "NetConnection.Connect.Success"){
/ ?/ z/ x* L$ c/ v info_txt.text = "连接服务器成功!!";
+ [: Y# V3 K; Y- _ C% t info_txt.textColor = 0x66CC00;
: L) Y$ a" v, W }
5 |# M2 T% s" J' F: u6 @$ B+ y else{' W. x' x- w# S6 }% z' m. t
info_txt.text = "连接服务器失败!!"; ?; y& y p5 R7 S- T( `) Q
info_txt.textColor = 0xFF0000;) T) y- H' q0 U7 L W2 o
}
! p5 F( d9 Y8 c* P R0 V# h- Z- D1 Z}
% D* w( I" a4 d1 qvar user_rso:SharedObject = SharedObject.getRemote ("chat_rso", my_nc.uri, true);$ j* M0 z- t. R, ~- U* w$ R
user_rso.connect (my_nc);" M( b8 |2 a0 y4 U2 a- k& e& o! o
//建立摄相头和麦克风对象" T8 f8 G+ H6 r0 p
this.cam = Camera.get();8 j. z" y% E% I" T& q# y
this.mic = Microphone.get();7 m3 T- \7 g3 x' ?, L
videobox.attachVideo(this.cam);
: B5 W& y( i1 v z0 Z% |. mvideobox.attachAudio(this.mic);
- i, Z9 ~" C# Y* Q$ P7 Hsend_ns = new NetStream(my_nc);. `& B% }5 l4 I0 I* C/ u
send_ns.attachVideo(this.cam);; T0 C g( ]/ B: c
send_ns.attachAudio(this.mic);2 r7 L# L0 N9 F- Y7 C
send_ns.publish("humorguy");
9 _" b. g0 \! D; Hget_ns = new NetStream(my_nc);
@! n. U9 { i& Q3 u% aget_ns.play("humorguy");
0 U8 X2 }& |( L/ M- lvideobox2.attachVideo(get_ns);
% m( D, U. A* }% o! `1 d5 t; y, A1 o//更新聊天内容
% O& W' C, ?9 ^user_rso.onSync = function (){
. u! A! ~; d% I8 a, J T( {3 J chatOutput_txt.text += newline+this.data.chatname +":" + this.data.chatcontent;
; c" V/ [0 b6 F* c; P2 f/ q8 p chatOutput_txt.scroll = chatOutput_txt.maxscroll+1;//确保最新消息能显示在输出框里0 \: H" ]: g& p+ _2 t
}: \# u( B7 \3 \! |3 m
//回车键发送聊天内容
; O* ]0 Q9 J7 F: yfunction myOnKeyDown() {
5 f$ b9 [% w; V% M' z1 k if (Key.getCode() == 13) {: a: p' F O8 y$ y A1 F v
if(chatInput_txt.text != undefined && chatInput_txt.text != user_rso.data.chatcontent){
% B! h" ~2 h& o7 Z( v7 ?3 _ Selection.setFocus(chatInput_txt);
5 b; E# a' o5 \9 w2 P2 ^7 I user_rso.data.chatcontent = chatInput_txt.text;# J" e: K+ \$ a) v& @9 ^
if(name_txt.text != "" && name_txt.text != user_rso.data.chatname){
' W/ }! W+ s: L7 R- A# ] user_rso.data.chatname = name_txt.text;
& |6 f1 ~) S# E$ o% B& \! r }
, u* r7 b1 l# Z9 Y9 f }
$ e. v' g3 {2 j! ` }! h& g3 A7 F) a- b: ^
}
?$ M8 E% _! o' Mvar myListener:Object = new Object();5 T) x* U. C+ u9 _/ k# @# d
myListener.onKeyDown = myOnKeyDown;/ ^9 l. D2 V7 B1 T# h. P
Key.addListener(myListener);
* ?( c# X. E$ c7 x, P//构造检测摄相头和麦克风状态的函数0 O0 g6 c% a' s; c" F3 j
function checkforCam_Mic() {, k- H4 C. M/ Y+ G" G
camArray = Camera.names;
: | ?. v! P v$ t- S% r7 _2 |7 ` micArray = Microphone.names;
& v7 V- l9 D+ d7 S: Z0 Y7 s if (camArray.length>=1) {" A1 }) Q! [5 H! B! w
temp_cam = Camera.get();6 c5 ?( c, h7 R2 ]
if (temp_cam == -1) {
* h3 c9 y0 Q% C: P% B* d camInfo_txt.text = '视频设备正忙!';9 C' g: F; ^* D/ [ y
camInfo_txt.textColor = 0xFFCC00;2 W Y1 j/ z5 D) q0 f8 Z6 h
} else {4 m/ @7 N; F% r1 E
camInfo_txt.text = '视频设备可用!';# B# ^- y- A& j: }# X8 \( e$ e% D
camInfo_txt.textColor = 0x66CC00;
" h7 M6 t- G% l: _4 S) v1 R5 e$ l }& @$ c- f6 G6 Y P3 s
delete temp_cam;/ Y- L. ]6 X( _2 q0 t6 {
} else if (camArray.length == 0) {2 l1 {, z: l* Z, l' O* r$ z
camInfo_txt.text = '没有视频设备!';
; d6 ? P. h$ B* ` camInfo_txt.textColor = 0xFF0000;
! ?0 p: c& }7 a }/ A( n) }/ S! Y9 ^
//检测麦克风状态
1 `) T, i$ I* g1 v( } if (micArray.length>=1) {
]& t$ @2 T8 F4 ?! a temp_mic = Microphone.get();- s! ~) F" r1 I4 e x
if (temp_mic == -1) {
% T' [0 x( c5 `/ e& R camInfo_txt2.text = '麦克风正忙!';5 {* k: i w3 A7 H$ V* j, l
camInfo_tx2t.textColor = 0xFFCC00;
6 Q m0 J( R# ` } else {- @: W" ^' o- ~$ z& R4 X* @
camInfo_txt2.text = '麦克风可用!';( I* C7 w, V" x% o7 ^5 Q6 q8 h
camInfo_txt2.textColor = 0x66CC00;* ] S5 T0 s7 r6 ^6 J: Z2 R
}
' a- S% r( t ^& ^9 D# [0 | delete mic_cam;) h9 Z7 k) ? D4 V" T
} else if (micArray.length == 0) {% p0 S$ x; ~4 [2 {# s+ _
camInfo_txt2.text = '没有麦克风!';
" P9 |' a. {0 R3 } camInfo_txt2.textColor = 0xFF0000;
3 Z1 G0 J$ N! [5 ~1 U3 S4 l/ |- A8 C }
! r+ Z8 n: |( ^* J7 K+ V}( f& X/ K0 ^; X1 W: f0 ?' J
checkforCam_Mic(); |
|