上一篇 | 下一篇

使用Director MX和Flash Communication Server MX制作视音频通讯(一)

发布: 2007-1-25 16:25 | 作者: macromedia | 来源: 译自macromedia.com | 查看: 348次

原著:Macromedia
i^x'h#f[XS 翻译:十年磨一剑奥古多媒体U9~0\&B)^H4r;X7Vo0A#a0d
奥古多媒体1zcp"B:DO,i"p*F5^g+e:^
使用Director MX,你可以在你的Director影片中使用Flash MX的高级特性。包括使用Flash Communication Server MX来发送与接收视频流。一些Flash MX的特性可以在Director中只用Lingo程序就可以调用了,而另一些特性则必须要有一个Flash角色才可以调用。
lT?4E;Kn
q7g|5G|ET,? 使用Flash Communication Server MX来发送与接收视频流需要一个舞台上有名为视频剪辑实例的Flash演员。本文详细描述了名为“Lingo_Videochat.dir”的Director例子,它包括了所使用的Flash演员和控制该演员的Lingo程序。
,T%XQ ?1Kf~3Sv
toE!F] u@ 例子下载奥古多媒体v/v)I}(O8@L

3O|:h%@2Zq,DMw 例子影片被设计为展示如何建立NetConnection object以能够与Flash Communication Server MX进行通讯,建立Camera and Microphone objects以能够访问本地计算机上的摄像头和话筒硬件,建立NetStream objects以能够发送与接收视频流。所有这些被影片Lingo程序建立的objects都是ActionScript objects。一旦它们被创建,就可以用它们原有的ActionScript方法来操作它们。奥古多媒体 B3Oul"CU'V E

rC4|4U EV 例子影片包括两个场景。第一个场景允许使用者输入他自己的名字和他想进行视频通讯的人的名字。这个场景发生在第2帧上。第二个场景了用于显示从另一通讯者处传过来的视频流的Flash精灵。这个场景发生在第4帧上。奥古多媒体hu2jCO

4Sc2K|B:N)U 在第一个场景,使用者输入他自己的名字和他交谈的朋友的名字。在这一场景中的“Connect”按钮被加上了名为“connect button behavior”的行为。这个行为在下面的部分会详细讨论。奥古多媒体-O5F.l3kO.N;KGLbr
奥古多媒体j] M:yh0h5Ej?+bQa
在第二个场景,从另一通讯者处传过来的视频流会被显示在Flash精灵上。这个Flash精灵的Flash演员是十分简单的,它仅是舞台上有一个名为视频剪辑的实例的Flash影片。该Flash影片的SWF和FLA版都包含在本文的下载包中了。打开“simplevideo.fla”文件,你可以看到只有一个简单的名叫“VideoClip”的视频剪辑实例。这个Flash精灵被附上了名为“Flash sprite behavior”的行为。这个行为执行创建NetConnection, Microphone, Camera, and NetStream objects的主要工作。这些都是你可以用Lingo来创建和控制的Flash ActionScript objects。第二个场景也包括了一个用于结束与Flash Communication Server MX连接的“Disconnect”按钮。
5k \6a%am X5A 奥古多媒体|;T fz@,K8@
“Connect”按钮的行为
Lc o5fgwp"p)u's8u&p 奥古多媒体l aos }P
“Connect”按钮上附上的行为包含以下Lingo:
GS ce#x 奥古多媒体+NHEx ZVA
global gNames奥古多媒体 q,NO#n9p,MP
奥古多媒体 {,LLM@6LGr
property pSprite
)ctP8B:\)}t
|![M#f\u+i on beginSprite (me)奥古多媒体g/mouwM
  奥古多媒体'mF9y jtQ,u MK
  -- initialize a sprite reference奥古多媒体#G ^#u)R&Y'u#Z~h1B
  pSprite = sprite(me.spriteNum)奥古多媒体1\Ro b(c+M^ O7i
  
Jt2LCmw   -- initialize the sprite's cursor奥古多媒体 Q{ XO$M
  pSprite.cursor = 280奥古多媒体Dh T&I5~;S
  奥古多媒体qF_dl#|C
end beginSprite
q(}`!^)?'gk8[(||
G7l S~0x5S on mouseDown (me)
uw {t)PF2mK't_   
xP?'@$] dS P   -- pull each name entry
4HguER r/i;T   tPublishName = me.stripSpaces( member("publish name").text )奥古多媒体}By*G!FsY:Bzw
  tSubscribeName = me.stripSpaces( member("subscribe name").text )
c N+M|!V)[ \@   
5A+X1MC$N%j0o   -- verify that names have been entered
G}9cmjs!ErQ5V.w   if ((tPublishName <> "") AND (tSubscribeName <> "")) then奥古多媒体\r2J R#kN.eP
    奥古多媒体#cX6W:z:bi_}
    -- store both names in a global variable奥古多媒体p7{ J(L5tS8{4j
    gNames = [:]奥古多媒体'pz k MXJv l_
    gNames.addProp(#publishName,tPublishName)奥古多媒体+GDO jM
    gNames.addProp(#subscribeName,tSubscribeName)
^z v9CEFL`(y     奥古多媒体6m Kw8_e+s#]o8U
    -- jump to the next marker
:_ s;r H:nIW\     go next奥古多媒体q YGsO Z }
    
"b*m5pa z"LZ5Jh   end if奥古多媒体m!nA]:KZ
  奥古多媒体{F6J-Hr:\"t X)G n
end mouseDown奥古多媒体/k*g5ch1J\5\-gb'a'w
奥古多媒体Q(Kb/w}d U`
on stripSpaces (me, aString)
$M2gK_3zgp-nl%P   
M X gc/p6S m   -- clear all spaces from the string
.s&}"L|+hAwx   repeat while offset(SPACE,aString)
;Ee2K)_*m s\'EL     tCharIndex = offset(SPACE,aString)奥古多媒体aN(ti/OC0_;un
    delete aString.char[tCharIndex]奥古多媒体)~bUQzn?u
  end repeat奥古多媒体/X vdL\ h+K~!H
  奥古多媒体+^|H;C2D8y \&x
  -- return the string奥古多媒体MXid]2V+s
  return aString
fM\}s   
gE\Qu/^)f end stripSpaces奥古多媒体r8Nsd[O,y.uZ
奥古多媒体(~n7W&c6i)C!f0df
这个行为包含一个变量声明、一个属性声明和三个处理程序:on beginSprite 、on MouseDownon stripSpaces。
5T)HA ?8_U 全局变量gNames被用于储存一个包含两方使用者名字的属性列表。属性变量pSprite被用于储存“Connect”按钮精灵的引用。奥古多媒体hX*cI;SC

/Yqf5H"_W on beginSprite处理程序包含以下Lingo:奥古多媒体3zJ+Q|t+AH6v6r
on beginSprite (me)
FA(j-Thh(y   
+e xc i Iyw2E   -- initialize a sprite reference
~+V4DtR   pSprite = sprite(me.spriteNum)
a6w L3S mS+N*G   奥古多媒体Crq6b:KblN
  -- initialize the sprite's cursor
8Ec!hg~GA+a(dE   pSprite.cursor = 280
llfz a#}3ieso3q _   奥古多媒体3d3t4Kyz
end beginSprite
$Ig8|E:OCc 奥古多媒体X{+? tgw \
它开始于以对该行为附加于其上的精灵的引用来初始化属性变量pSprite。然后该处理程序设定精灵的cursor属性的值为280,这会使鼠标指针在该精灵上时会变为手指状。奥古多媒体Ra.Ul7M|I%YO"H
奥古多媒体'ed3MPY7fA [;r qE
on mouseDown处理程序使用on stripSpaces处理程序来删除输入的名字前的空格,然后使用以下Lingo来把名字存入变量gNames中:奥古多媒体s_T)Ri5r4\S
奥古多媒体PMUr]!^3b
on mouseDown (me)
O;V:IB@ ZS   奥古多媒体Khk%m7F2jC:_4P
  -- pull each name entry奥古多媒体6exr0m*\
  tPublishName = me.stripSpaces( member("publish name").text )奥古多媒体'Mx*j j(dQ
  tSubscribeName = me.stripSpaces( member("subscribe name").text )
mDGH F   奥古多媒体D i_)`*i
  -- verify that names have been entered奥古多媒体1b"~1R/sF C:];grx
  if ((tPublishName <> "") AND (tSubscribeName <> "")) then奥古多媒体CP(D/W+~"G
    奥古多媒体aK-|&CQ(b
    -- store both names in a global variable
4dN"olBg)g     gNames = [:]奥古多媒体1Ih8i&Q)nZ]
    gNames.addProp(#publishName,tPublishName)
}9]Rn9B1wo     gNames.addProp(#subscribeName,tSubscribeName)奥古多媒体c v(qf:mH
    奥古多媒体5C$d^`,o$m:lM
    -- jump to the next marker
|G8sliFf     go next
{_x7fi{7@     
2}9BuS9p   end if
#vV$v*o%Aj-r"|?L   
%?6T;AH8j*fATP end mouseDown
e/x?e5V+Kf3{
!iGM^+Su 当使用者名字的列表被加入了变量gNames后,go next命令就会让播放头移动下一个标记(marker)处播放。这下一个标记是第4帧,就是第二个场景所在处。
%H(}@!O/t6H;]/^'u!C8W 奥古多媒体o;N.c"` ~Y y
Flash精灵的行为
+H/dF(Nt6x8N
"Y1LwtV 影片的第二个场景包含了显示传入视频流的Flash精灵。该精灵上附上了名叫“Flash sprite behavior”的行为。这个行为包括了创建和控制传入和传出的视频流所需的所有ActionScript objects。
;q.b#y2d.Hm5U 奥古多媒体RO^ BBJ oCp
通常来说,这个行为执行以下任务,将在这部分详细讨论它们:
Cl-@5|lQjy|.T_ * 声明变量与属性奥古多媒体4?cBN:|H0mq
* 创建新的NetConnection object奥古多媒体 a jEr8D L7Z
* 为当与服务器的连接建立时调用 on initiateStreams处理程序的NetConnection object的 onStatus 事件建立一个 callback 处理程序
7B#l Kup7N5Z_ * 使用NetConnection object的connect方法连接Flash Communication Server
0u Fuk`o ]w * 创建新的ActionScript Camera and Microphone objects并对它们进行引用奥古多媒体2z%XkF%~y#?2_K
* 创建新的名叫pOutStream的ActionScript NetStream object来传出视频流
iAu4_u'VIP * 把Camera and Microphone objects附上新的NetStream object
SBWy7Ku^ljE c * 使用的NetStream object发布方法发布传出视频流给Flash Communication Server
;w1Lg7xy * 创建新的名叫pInStream的NetStream object来接收传入视频流奥古多媒体W5te1v%p${&z ~1e
* 用NetStream object的播放方法来鉴定传入视频流奥古多媒体,l x%f8[ dj*N
* 用getVariable命令来创建一个对Flash精灵的movie clip的引用
x_6w(z;H * 用attachVideo方法把传入的NetStream object附于上Flash精灵的movie clip
@$emdR9oi"F j * 当精灵完的时候关闭NetStream and NetConnection objects奥古多媒体:i-VQ(b,e^L8rr

_O)VLv}R:@ 更详尽地看这个行为脚本会揭示这个脚本为了成功地连上服务器、发送和接收视频流必须要做什么的细节。以下是这个脚本:
o l#} e8|N&P
6_q,yl!EE global gNames
*W4UqIi 奥古多媒体kZ `;`}x(W6}
property pCamera
7| B'QAp7{!{ property pInStream
Ra*lp0v fDO&P property pMicrophone奥古多媒体y4v-N8r1B#ik
property pNetConn奥古多媒体ce SK$n sd)X
property pOutStream奥古多媒体)`q:[{V2k c#L
property pSprite
0D(MH3?9d T'M
Bh!}"q/K L5aZ|E on exitFrame (me)奥古多媒体$a pD@R'NNJ
  
(|r)\"GI:O @ Q   -- initiate the connection if necessary
%G3GG2?"v)x}u   if voidP(pNetConn) then奥古多媒体|EfA2p9x
    me.initiateConnection()
H;}`4j4[*OVCG Y"L   end if
U _,jMnp;_   
+J5F.mL@!b|&k ~ end exitFrame
B!ZkaG
F0MC4^"W on initiateConnection (me)
xi d)s.S6d1q}   
)hk2s!I4]f.I!mmaO   -- initialize a sprite reference
1q \ Q7S0?5XL6F   pSprite = sprite(me.spriteNum)
d.JEV1i'OI   
L5^|T"[-Do   -- create a new NetConnection object
?+p`Z9] Bo   pNetConn = pSprite.newObject("NetConnection")奥古多媒体S.}6E] h0~_-O
  奥古多媒体Z9Q%^Y;?#~~#V
  -- declare an onStatus callback handler
I$`Jp2VM8dp   pSprite.setCallback(pNetConn,"onStatus",#myOnStatus,me)
"IrOT9L0O9g"}   奥古多媒体8iN0r3b.HI l5[ L.e
  -- set the connecting URL奥古多媒体;_sE5T(a6? a
  tURL = "rtmp://diggler.macromedia.com/thiggins_simplechat"
l)Pw6yY,e"F)f)?   奥古多媒体JWRr%|x
  -- connect the object to the server奥古多媒体9~-Lv1Rs&t:p^
  pNetConn.connect(tURL)奥古多媒体!`-ggy}(R)^L$^
  奥古多媒体9C8n@a$gpa
end initiateConnection奥古多媒体%B?F-Z^ XxJ
奥古多媒体O7so d-_ ai+Ze0m|
on initiateStreams (me)
.Sv2s\6] ^   奥古多媒体4ew9U6L z;X yR
  -- gain references to the camera and microphone
#g9r,^CV)}C   tCamObj = pSprite.newObject("Camera")奥古多媒体M4Q1B;n[;Qd
  pCamera = tCamObj.get()
WsD2bO.K]!u7do$P   tMicObj = pSprite.newObject("Microphone")
9TM&M n/H6X&D   pMicrophone = tMicObj.get()
1z*l,bAuz(m   奥古多媒体8gs+Z*rHC
  -- create a NetStream object奥古多媒体1XxZBV.E#X/k+~3R
  pOutStream = pSprite.newObject("NetStream",pNetConn)
muUs:u1l/RN   奥古多媒体@L3i|&gp#bL
  -- attach the camera and microphone to the outgoing stream奥古多媒体yl$~j7Y l9t
  pOutStream.attachAudio(pMicrophone)
r3z]'LZ   pOutStream.attachVideo(pCamera)奥古多媒体d f\U{$L
  奥古多媒体(Xt$N0bZ
  -- publish the outgoing stream奥古多媒体q.Bq(v)]2JASe
  pOutStream.publish(gNames.publishName,"live")
e-aM(N!r(^   奥古多媒体 z]-A.a-x? c.@
  -- create another NetStream object奥古多媒体AYaC+Ao
  pInStream = pSprite.newObject("NetStream",pNetConn)奥古多媒体+i"wxhmO&r:n~Pvm
  
\7u az,ynex.uWeoI'[   -- play the friend's stream奥古多媒体h Y*m#|:M8Er6l
  pInStream.play(gNames.subscribeName)奥古多媒体~ klX/IZ4?/_ y2k
  奥古多媒体"Gc"C[2d)N2^pC
  -- get a reference to the video clip instance on stage
[C1bW,_0d3L   pVideoClip = pSprite.getVariable("VideoClip",FALSE)奥古多媒体({ ] `;f!lrf!PD0p
  奥古多媒体q1dMD+G]*o6S
  -- attach the incoming stream to the video clip奥古多媒体;K'e_|"in{&Y U
  pVideoClip.attachVideo(pInStream)
9QwQ![&Kc Z)g   
0E(N!Z0`wC | end initiateStreams奥古多媒体Q:W'k{ M6c f2`N{

@&t3?qs on endSprite
ka8nYWf8t U6_7mAm   
5\Mmi2?;N4X$@\X(t   奥古多媒体 BO O0E#jU0Dq
  -- close the streams if necessary奥古多媒体3VK n`;B.e2d6A0Q
  if not( voidP(pOutStream) ) then奥古多媒体!lg.S1]i%Sj
    pOutStream.close()
Xh!XD5A   end if
$FP Ft;L   if not( voidP(pInStream) ) then
kD-gWv Z     pInStream.close()奥古多媒体_e)\2A4n6f?X3k
  end if
)@x4fu)K"}T)m)BlU"w {   
h(Q:c*G$E:k-~   -- close the NetConnection if necessary
$j](F6~ls ? O   if not( voidP(pNetConn) ) then
;U{%L wgh0l3p8?8Y)C     pNetConn.close()
9jk5IP8S*` wJ2\U v   end if
+Vf?L})},b   
3J~mY;wZc end endSprite奥古多媒体7s%jl)]vCY

lJ0P6nU'bD on myOnStatus me, aArg1, aArg2
mq1ft }N9r   奥古多媒体u'Hh!Ks
  if (aArg2.code = "NetConnection.Connect.Success") then奥古多媒体 d?:O+\ M1a5T
    
ast*M#X0o:S3L8X     -- initiate streams奥古多媒体#B.pr.K7K;yT6uJ
    me.initiateStreams()
kB5_:\s(VZ&^{+Z~     奥古多媒体)n/wz[ PTc~;M
  end if奥古多媒体R z1^l R5KSak
  
$wU;H/Z$n| end myOnStatus
_ vH`5iv2e1o
K{%P9w r 这个行为的第一部分声明了一些要用到的变量与属性:奥古多媒体4HJ3B&[W5h
* 全局变量gNames包含参加聊天的使用者们的名字的属性列表。奥古多媒体5xH#]N?
* 属性变量pCamera将包含从使用者的计算机上提供传出视频的Camera object奥古多媒体6^)H ueoNj;e3R
* 属性变量pInStream将包含传入的NetStream object奥古多媒体(| H4] K0k J
* 属性变量pMicrophone将包含从使用者的计算机上提供传出音频的Microphone object
X1JhvO#S * 属性变量pNetConn将包含主宰传入和传出NetStream object的NetConnection object奥古多媒体1__:DXG
* 属性变量pOutStream将包含传出NetStream object
%?(@-A+@`%f * 属性变量pSprite将包含一个对这个行为附加于其上的精灵的引用。
K,PT)u2Kc#Lm%P-v
z&g/v}3m Z| 第一个处理程序是一个on exitFrame处理程序,包括以下Lingo:
ReH`RY W(c
7c/E9I-aF[`)Gt ~ r on exitFrame (me)奥古多媒体%z"Y7ox$a5m-b*z2dv
奥古多媒体I0v A*b|.O
-- initiate the connection if necessary
HIV%WN*x\8nx   if voidP(pNetConn) then奥古多媒体-cAVx*\#Z R0{%j
    me.initiateConnection()
,jyT`Cd/Y;_3\u   end if
m)u}S Pk"C
J*sb#YXL aB end exitFrame奥古多媒体 k#ykG^1iPDTG3Z
奥古多媒体"eH2wzXuO
每次播放头离开包含Flash精灵的这帧时,这个处理程序就会使用voidP()功能来检查pNetConn这个NetConnection object是否存在。如果pNetConn object不存在,这个处理程序就调用on initiateConnection处理程序来建立它。一旦这个NetConnection object已经被建立,这个处理程序就会什么也不做。奥古多媒体6lE'Bmp3XC~*V'g9gi

\:c M5\k-u X7Y initiateConnection处理程序奥古多媒体(pt(q1gL)H

#l]7h/k)m 下一个处理程序是on initiateConnection处理程序。它开始于建立一个对这个行为附加于其上的精灵的引用:
{x;c;O$v9b5_
m4j gR/hZ pSprite = sprite(me.spriteNum)
9mw;w2Rj6p'k D c
q!_D OF 然后,这个处理程序使用newObject()命令和Flash精灵的引用来建立一个新的ActionScript NetConnection object:奥古多媒体!O!Z$_g|TR

V.C qV.w"^\@l'd0\ pNetConn = pSprite.newObject("NetConnection")
6{B:l&A.?FC!B!c_
t~XmO{1A 这个NetConnection object被存储进了属性变量pNetConn中了。奥古多媒体D]Sa ~~k
奥古多媒体Y"Q+sk R K$iQ c
一旦NetConnection object被建立,一个callback会因它的onStatus事件而被确定。当NetConnection object从服务器处接收到一个信息这个onStatus事件就会发生。在这儿,服务器返回的仅是连接确认信息。
:bZL'TK9`1P}a 奥古多媒体$xRLA7fb+g"h'Cp%O
这个callback处理程序被用setCallback()方法来确定:奥古多媒体xD/r:_*[
奥古多媒体HDRe Qx8D U
pSprite.setCallback(pNetConn,"onStatus",#myOnStatus,me)奥古多媒体+y? ]&Us+]_/o;B
奥古多媒体 EGpdh!FX)m'x
这个setCallback()方法包括NetConnection object、活动事件名字、callback处理程序名字和包含callback处理程序为参数的script object的名字。在这儿由于script object就是当前的程序,所以关键字me被使用。callback处理程序检查与服务器的连接正确然后调用处理程序on initiateStreams。
b7i nz\|
Y5^~-GdkD,MeW6] a 当callback处理程序被确定之后,就用以下语句来初始化与服务器的连接。奥古多媒体F?~H0l Nc.oA

:V hN-u'@0?tj -- set the connecting URL奥古多媒体8p/Ky#L-\
tURL = "rtmp://diggler.macromedia.com/thiggins_simplechat"奥古多媒体!{mKY*[[9x*Qf
  奥古多媒体#\Xf2?,f.?8bCg
-- connect the object to the server奥古多媒体"ZT1G#} k}w$l
pNetConn.connect(tURL)奥古多媒体/?YI#XE x

y&Rk0pAL d-x*LP 开始的两句把Flash Communication Server的网址存入本地变量tURL中。如果你想自己使用这个样本影片,可以以你自己的Flash Communication Server的网址来代替。Dirctor MX的光盘里有Flash Communication Server MX的安装程序。
0Pd$@%\ Y 下一句是用NetConnection object的connect()方法来连接服务器,以参数的形式来传送网址。
.\;i)Jd s&T8TK 奥古多媒体 Rk,P8]uD:v
当connect()方法初始化与服务器的连接时,服务器会回复一个表明试图连接的成或败的onStatus信息。这个onStatus信息引发了先前确定的callback处理程序。
$tl Ux7sZy!rsS F,O3z  奥古多媒体qc{1PkHYKBn iL

Z K8jYWw8z,] The myOnStatus callback handler奥古多媒体{A%QDyo+}Z0z
奥古多媒体"G}U/lOVtY
这个callback处理程序名为on myOnStatus,是在on initiateConnection处理程序中的setCallback()语句确定的。这个处理程序包括以下Lingo:奥古多媒体6u4~ \[:FE#]
奥古多媒体!a:Vs"\%]X4Y"I.HK
on myOnStatus me, aArg1, aArg2奥古多媒体iGe9~,oK5S+j7rAU
  
P*c~^.R   if (aArg2.code = "NetConnection.Connect.Success") then
&uPKgBj"A     奥古多媒体!E^7P9_6b5m^5FI0Q'J
    -- initiate streams
TqI#lif     me.initiateStreams()
vIH6id     
r,cb_Q1\,w   end if
Eg$x#~1g:s   奥古多媒体eY"^"O9K&N
end myOnStatus
Cu1l{ ?
4i:c7`h:IZ8U 当服务器回复一个尝试连接时,它会传送两个argument给callback处理程序。第二个argument包含有一个属性列表。在本例中,myOnStatus处理程序仅是简单地检查第二个argument中的属性code中的状态信息。如果code字符串表明连接是成功的,这个处理程序就会调用on initiateStreams处理程序。奥古多媒体&GY;kX0cb'T

vl$A|K&|,Zs 这个onStatus的callback也可以用来作更复杂的错误和状态检测。要找到更多的关于如何在你的播放器上使用onStatus callback处理程序的信息,请查看Flash Communication Server的文档。奥古多媒体Jef$U [xM
奥古多媒体*f#V;|_A1j%Lr

2]Y*GD&X_ The initiateStreams handler
u"oI6M8xy:c 奥古多媒体p b`TZP lR
这个on initiateStreams处理程序开始于建立Flash Camera和Microphone object,然后使用成功建立的NetConnection object来建两个NetStream object。这些NetStream object是用来发送与接收视频流的。奥古多媒体eEJ E2Aq)hf+g}~

N?B0f DP 处理程序的第一部分用以下Lingo建立Camera和Microphone object:奥古多媒体 V*X0qPQR1M{U,O

%Jxc;caO -- gain references to the camera and microphone奥古多媒体{\{P:U8HH
tCamObj = pSprite.newObject("Camera")
%Icy8TV9Ix:X Z pCamera = tCamObj.get()
rf%vDr5p-b.V+K tMicObj = pSprite.newObject("Microphone")
!Vrf:hd$z!ZH8Ws pMicrophone = tMicObj.get()奥古多媒体~yO*N)l ?tN!`P

e0i/X-JXYx[ 第一行用newObject()命令来建立新的ActionScript Camera object,然后把它存入本地变量tCamObj中。第二行用Camera object的get()命令来返回一个对已安装好的视频摄像头的引用,并把这个引用存在属性变量pCamera中。再对下两行是对一个新的Microphone object进行同样的处理。奥古多媒体+iL"il"bJ7h%z

9k:O TFW)L$A{En 下一行使用newObject()命令来建立新的用来发送传出视频流到服务器的ActionScript NetStream object:奥古多媒体OVW@d`&E"qL a
奥古多媒体f4B;mib*_C
-- create a NetStream object
*{(H$@M%zOc pOutStream = pSprite.newObject("NetStream",pNetConn)奥古多媒体 lcCsj @

uj Kw1K[j)c newObject()命令的第一个参数是建立的object的类型。第二个参数是指定NetStream object用来与服务器通讯的NetConnection object。属性变量pOutStream成了这个新的NetStream object的一个引用。
P.lr3o2R 奥古多媒体W5OW4mV
一旦传出NetStream object被建立,就可以使用NetStream object的attachAudio()和attachVideo()方法把Camera和Microphone object附加于其上。对下两行可完成这个任务:奥古多媒体:rXk%~'N7T
奥古多媒体]~4c9`1JaJCA z
-- attach the camera and microphone to the outgoing stream
p Zk\5O pOutStream.attachAudio(pMicrophone)
$h-|e}*tw#P pOutStream.attachVideo(pCamera)奥古多媒体'@uRLt}qL

*w(W9{a2H7~4b0e 使用attachAudio()和attachVideo()方法来把以前建立的对Camera和Microphone的引用作为参数来传送。奥古多媒体&].O X"XS w,a
奥古多媒体4G)sg XM9e
当Camera和Microphone已经被附于传出NetStream object上时,它就可以随时进行发布了。处理程序的下一行就使用了NetStream object的publish()方法来发布这个视频流:
G FN2lH 奥古多媒体P@#{8Sd Wq&Z(z
-- publish the outgoing stream奥古多媒体;aPS6E?F3OF@}2X
pOutStream.publish(gNames.publishName,"live")奥古多媒体8O.]SX [A d%F
奥古多媒体 OYU+O0gA/W2\
publish()方法的第一个参数是发送视频流的使用者的名字,这个名字是保存在gNames属性列表变量的publishName属性变量中的。第二个参数是表明发布这个视频流的方式。在这里这个视频流以live方式发布。
5E#`ae%~t*p 奥古多媒体9G7sPi\,Y0[+F
下一个步骤是建立另一个NetStream object来接收传入视频流。处理程序的下一行建立一个NetStream object并把对它的引用分配给属性变量pInStream:奥古多媒体![ OTwZ1e

#]{6FF,lV\??[ -- create another NetStream object
I$Qm9d.}0L3K pInStream = pSprite.newObject("NetStream",pNetConn)奥古多媒体Ht @4]`e fI&W!}w

C?;ShTm6[ 当新的NetStream object被建立了之后,这个object的play()方法可以把传入视频流与这个object相关且使它开始播放。处理程序的下一行使用以下Lingo:奥古多媒体{(Qg I(D

K&K'i*f:Y|(Qj&Fn -- play the friend's stream奥古多媒体7Qv5id8E` u([
pInStream.play(gNames.subscribeName)奥古多媒体p!{t` L3H$H |7P J

1Bd k F:H play()方法的参数指定了传入视频流的发送者的名字。
%he ZU*e9Y*ql R
O}oY3w8JZ,~1A 最后,处理程序最末的两行建立一个对Flash精灵里的video clip object的引用且把传入视频流附于video clip上:奥古多媒体^,umSHs_7R

%U)n{f/P#JP$G2{ -- get a reference to the video clip instance on stage奥古多媒体f'l aLLfL#e8_-L
pVideoClip = pSprite.getVariable("VideoClip",FALSE)奥古多媒体3JXJ1c,^z`7I

_P'a"Y:bj -- attach the incoming stream to the video clip奥古多媒体^2m8X!H;rU;q"Bm
pVideoClip.attachVideo(pInStream)
ga(f5SED0c I
g;zJ!eJO getVariable()命令建立一个对Flash精灵里的video clip object的引用且把它存入属性变量pVideoClip中。它的第一个参数是Flash影片中的video clip的名字。第二个参数用“FALSE”,是让getVariable()命令返回一个对video clip object的引用,而不是简单地返回代表它的字符串。奥古多媒体(}KU @)MBF
奥古多媒体 v*U tl5{9AP
video clip object的attachVideo()方法使传入视频流对象附于video clip上。这允许传入视频流被显示于Flash精灵里的video clip object中。奥古多媒体0OkCev
奥古多媒体d1q?4oC [z`
一旦on initiateStreams处理程序完成之后,传入视频流就会在舞台上的Flash精灵中显示出来。
9T'r$d!eK:Z X:im
4?${ym^ |FtY?/I1U The endSprite handler
IR%j/v'w%?"~
5c8Z5Az$l!n`f Flash精灵的行为中的on endSprite处理程序执行关闭两个NetStream object和NetConnection object的任务。每个object的close()方法是用来关闭它自身的。
kx*@F` [#[*l
9iF8u!I5e0T.^&v on endSprite处理程序包含以下Lingo:
/_c%g5P(NgO#i:sO+v
v:u@ dAt on endSprite奥古多媒体3v y.P qZa+K._ ts
奥古多媒体j5L*K[Vy
  -- close the streams if necessary
@ }#i{&[IhA   if not( voidP(pOutStream) ) then奥古多媒体W%n:aMSq:c9eJ`
    pOutStream.close()奥古多媒体1[#DjC8X
  end if
0q~| x!k7d   if not( voidP(pInStream) ) then
?,{@-op^q T     pInStream.close()奥古多媒体RtX}*z];\
  end if奥古多媒体Jx.kx9\R*P
  奥古多媒体2Qj/r1d`EA
  -- close the NetConnection if necessary
PbY#Z4\KtQr   if not( voidP(pNetConn) ) then奥古多媒体6V @!T V$M p
    pNetConn.close()
YV`2sn2z"Zb   end if奥古多媒体&AF hmk9e2d k
  奥古多媒体_8B!F [K yPE
end endSprite
5ude;|"C!_8E*q;i#\ 奥古多媒体U;dfvDBhM*g
这个处理程序在使用close()方法来关闭object前使用voidP()命令来检查每一个object的存活。处理程序关闭NetConnection object之前先关闭两个NetStream object,是因为它们依赖于NetConnection object的关闭程序。奥古多媒体6BA+AJ m@

O\%k{V$e 当使用者在视频场景点击Disconnect按钮时就会调用on endSprite处理程序。
;_ Pt6jJgO0s 奥古多媒体2gB8g8v#QX-V
以上所有这些处理程序说明了连接Flash Communication Server并发送与接收视频流的所有步骤。在你的播放器中应用这些步骤,你就可以在你的Director播放器中使用live视频了。奥古多媒体bTAny`q,X
奥古多媒体)`8yEJ4B#x
译后
?@DDv 奥古多媒体wb&`x,k:d
后来,为了更好地测试这个程序,就作了简单的改动,把它改成了可以用任何一个Flash Communication Server MX服务器的了。在实际测试中遇到了不少问题,会在之二中和大家一起讨论奥古多媒体#D!kx2G cXF
奥古多媒体)ZvO_/?*GN,T-r
(完)

字号: | 推荐给好友

 

评分:0

我来说两句

seccode


最新歌曲
转机 放生 黄玫瑰 摇啊摇 那滋味 擦肩而过 你若成风 幸福一辈子 依然在一起 吻得太逼真 感动天感动地 坐上火车去拉萨 怎么会狠心伤害我
心碎 冲动 小太阳 别碰我 蒲公英 爱情小偷 只要不亏 一定要爱你 等爱的玫瑰 无情的温柔 北极星的眼泪 最后一次的温柔 亲爱的那不是爱情
光荣 火花 下雨天 我可以 樱花草 为你写诗 独家记忆 再见小时候 寂寞才说爱 忘不掉的伤 爱上你是个错 第三者的第三者 孤独的时候可以抱你
假如 城府 是非题 有缘人 舍不得 我的答铃 只欠秋天 外滩十八号 越爱越难过 123木头人 爱走了心碎了 爱上你是我的错 爱情里没有谁对谁错