




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、6.1.铸造许多流制作一个全世界的广播系统的想法,看起来似乎有点雄心勃勃,但使用FMS3 ,它其实很容易。所有您需要做的只是发出一个包含音频和视频的流,使用” Studio”模块,并有一个“TV”模块set to pick it up。你甚至可以设置带宽分配,所以Studio模块使用更多的客户端到服务器之间的带宽,TV模块是有利的,所以大部分的带宽分配是从服务器到客户端。此外,您可以在live和录制之间切换和从远程位置取得报告。你走出去,并聘请一名新闻队伍之前,记得每一个客户端连接到应用程序,FMS3生成一个新的流。 FMS3既有的带宽和连接客户端的限制,所以根据您的fms3版本,您将可以服务
2、更多或更少的客户。但是,您可以创建一个广播的应用程序,优化带宽,使您可以服务一样多的客户同时,尽可能的仍提供服务器端的最佳A / V。6.2.切换摄像头一个在电视演播室工作的任何人都知道,制作人切换摄影机,大部分演出,约有3个不同摄影机拍摄。因此,在从一个摄影机切换到另一个,是设立自己的全球视讯广播公司的一个关键技能。6.2.1. 选择一个摄像头像在本书中讨论的多大数改变一样,AS3.0中的一个关键的改变是改变了取得一个摄像头的方法,在以前的as版本中,可以用一个整数作为参数来取得一个摄像头。现在在AS3.0中,用一个字符串。新的方式,仍然使用一个整数类型,当作一个字符串来做这事情。意思就是“
3、4”代替 4 。这个数字是摄像头在设置窗口中的位置。在最上面的是”0”,每一个摄像头是参照其在清单中的相对位置。因此,第五个摄像头是“ 4 ”就像一个基于0的数组。以下一行显示了取得在名单中的第5个摄像头:var cam2:Camera=Camera.getCamera(”4);Camera类的实例:cam2 ,现在是设置窗口的第5个摄像头。 (实际上,使用第5个设置) 。您可能还记得,如果没有使用参数,摄像头默认为最后选定的摄像头。例如,如果您最近使用的摄像头位置是”5”,下面的会设置为6(如果6在名单中):var cam1:Camera=Camera.getCamera();此举意味cam
4、1将取得第六摄像头,而不是在Flash Player设置窗口的第一个-在位置”0” 。6.2.2. 切换两个摄像头看看如何切换摄像头,以下应用程序最少需要2个像头。如果你只能有一个摄像头,借用一个或使用一个虚拟网路摄影机,您可以在网上找到。 (一个有趣的摄像头驱动程序对你的屏幕作为一个摄像头,提供您一个好屏幕捕获工具,它可用于Windows :/index.php?section=8)按以下步骤来建立应用程序:1. 建立一个CameraSwitch.fla文件2. 拖一个Button组件到库中3. 在文档类中输入CameraSwitch4. 建立一个
5、CameraSwitch.as5. 在CameraSwitch.as中输入以下代码:Example 6-1. CameraSwitch.asCode View:package import flash.media.Camera; import flash.media.Microphone; import flash.media.Video; import flash.display.Sprite; import .NetConnection; import .NetStream; import flash.events.MouseEvent; import
6、fl.controls.Button; public class CameraSwitch extends Sprite private var cam1:Camera; private var cam2:Camera; private var btn1:Button; private var btn2:Button; private var mic:Microphone; private var vid:Video; public function CameraSwitch () vid=new Video(320,240); vid.x=100,vid.y=30; addChild (vi
7、d); mic=Microphone.getMicrophone(); cam1=Camera.getCamera(); cam1.setMode (320,240,15); cam2=Camera.getCamera(4); cam2.setMode (320,240,15); btn1=new Button(); btn1.width=70; btn1.x=vid.x; btn1.y=vid.y+vid.height+10; btn1.label=Camera 1; addChild (btn1); btn1.addEventListener (MouseEvent.CLICK,camOn
8、e); btn2=new Button(); btn2.width=70 btn2.x=btn1.x+100; btn2.y=vid.y+vid.height+10; btn2.label=Camera 2; addChild (btn2); btn2.addEventListener (MouseEvent.CLICK,camTwo); private function camOne (e:MouseEvent) vid.attachCamera (cam1); private function camTwo (e:MouseEvent) vid.attachCamera (cam2); 在
9、测试程序之前,请检查您的Flash Player的设置窗口,并且确保列表中至少两个设备。如果您只有两个设备,确定哪一个是默认的,然后输入字符串数字等。(例如,如果您只有两个设备和第一个是默认的“0” ,然后设置cam2为”1” )。在接下来的Studio应用程序。如果您只有一个单一的摄像头,你大概不会想添加了第二个摄像头。不过,如果您想要把您的studio成为一个更强大的应用程序,那么只需合并Example 6-1的代码。建立一个最简单的广播工作室是一个很简单的操作,要求只不过是一个模块与送出现场的音频和视频流。为了使它更容易,特别是在最后,这种应用程序包括一个可重用的类,只不过是为设置流出和
10、流入的流。这个类工作起来,就像一个实用工具类,您可以重新使用,以简化创建流式音频/视频的工作。6.3.1.公用流类第一步是建立公用类让音频和视频流可以简单的工作。它使用以下列几类:ClassesNetConnectionNetStreamCameraMicrophoneVideo这个公用类是扩展NetStream类,这个类有两个公共的方法:一个是流a/v出去(streamOut),一个是流进来(streamIn)。记住,一个流需要一个麦克风实例、一个摄像头实例、一个流的名称。streamOut方法的参数就是这三个元素。反过来,要播放进来的视频,所有你所需要的是视频对象的名称和流的名称。因为这首
11、先是最低限度的应用,只有视频流出来,您可能感到奇怪,为什么理会streamIn方法呢?这个类的目的是:不是让一个应用程序更好的开发,而是多个。在稍后的章节,您将了解如何创造一个“receiver”,像电视机一样工作,而且您将高兴地看到, streamIn方法包括在内。最后,一个元素你可能不熟悉,是super语句。此公用类是扩展NetStream类。创造一个NetStream实例,你需要包含NetConnection参数。Super语句调用父类的NetConnection,所以,当你建造一个StreamAV实例,您可以包含必要的NetConnection参数。按照下列步骤创建此公用类。1 建立一
12、个StreamAV.as.2 添加以下的代码Example 6-2. StreamAV.aspackage import .NetConnection; import .NetStream; import flash.media.Camera; import flash.media.Microphone; import flash.media.Video; public class StreamAV extends NetStream public function StreamAV (nc:NetConnection) super (nc); public
13、 function streamOut (mic:Microphone,cam:Camera,stream:String):void this.attachAudio (mic); this.attachCamera (cam); this.publish (stream,live); public function streamIn (vid:Video,stream:String):void vid.attachNetStream (this); this.play (stream); 6.3.2.基本的播出演播室第一个Studio模块非常简单。只是显示TV Anchor(你)和”on t
14、he air”消息,让你知道你已经连接了。第5章中展示了怎么流进来和流出去。这个模块是简单的流出去-使用StreamAV类帮忙。ClassesNetConnectionNetStatusEventCameraMicrophoneVideoSpriteTextFieldStreamAV为什么NetStream类没有列在这个应用程序中?因为你将用新的公用类StreamAV处理。在Broadcast和TV 两个应用程序中,使用StreamAV类。以下介绍建立一个studio的最少步骤:1. 在MS3的applications目录中建立一个名为studio的目录2. 建立一个Broadcast.fla
15、与StreamAv.as同一目录3. 可选,用一个照片来作为studio的背景,或者用flash画一个。使用矩形工具在背景上面画一个矩形,宽200高150,位置为x=150,y=190。这将作为监控屏幕。在左上角的位置,添加了第二个矩形与尺寸为W = 75 ,为H = 21 ,为Y = 21 ,为Y = 68.5 。图6-1显示了总体思路,和图6-2显示什么,您会看到当您执行该脚本。图6-1. Studio backdrop4. 建立一个Broadcast.as与StreamAV.as和 Broadcast.fla同一目录5. 在Broadcast.as文件中添加以下代码Example 6-3
16、. BroadCast.aspackage import .NetConnection; import flash.events.NetStatusEvent; import flash.media.Camera; import flash.media.Microphone; import flash.media.Video; import flash.display.Sprite; import flash.text.TextField; public class Broadcast extends Sprite private var nc:NetConnection;
17、private var cam:Camera; private var mic:Microphone; private var vid:Video; private var rtmpNow:String; private var onAir:String; private var broadcast:StreamAV; private var good:Boolean; private var txtField:TextField; public function Broadcast () /Set Camera and Microphone nc=new NetConnection ; nc
18、.addEventListener (NetStatusEvent.NET_STATUS,checkConnect); cam=Camera.getCamera(); cam.setMode(240,180,15); cam.setQuality(0,85); mic=Microphone.getMicrophone(); mic.rate=11; vid=new Video(240,180); vid.x=150; vid.y=90; addChild(vid); txtField=new TextField(); txtField.x=150; txtField.y=75; addChil
19、d(txtField); rtmpNow=rtmp:/1 /studio; nc.connect (rtmpNow,anchor); /Connection private function checkConnect (e:NetStatusEvent) good=.code = NetConnection.Connect.Success; if (good) txtField.text=On The Air; broadcast=new StreamAV(nc); vid.attachCamera (cam); broadcast.streamOut (mi
20、c,cam,presentation); 当你运行这个模块,你将会看到你自已在监视器中和一个on the air信息指示你已连接到服务器了。这个单个的流从你当前的摄像头和麦克风中发出。图6-2. Broadcast studio你现在有一个广播室,您需要一个模块来接收串流的材料。这基本上是电视,用户可以观赏到您的视频。6.3.3.最简单TV如果您认为最简单工作室是很容易,最简单TV会更容易。所有您需要的是一个视频对象在舞台和您良好的路要走。这些最基本元素,是您需要的类:ClassesNetConnectionNetStatusEventVideoSpriteStreamAV像studio,你可
21、以简单的制作你的TV或者精心的制作。我使用了一个老式的TV作为背景,然而在其它方面,它是简单地完美,按以下这些步骤来建立TV:3 建立一个fla文件,舞台尺寸为360X3504 你可以把舞台设置更小,但是不能小于215X138。小于那个尺寸的话,就会小于设置窗口,不能工作了。对于这个特别的应用程序,不要让它小于215X150,因为你的视频大小是200X150。还是把它设大点的好。我是基于TV图像的尺寸来定制这个尺寸的。5 保存TV.fla与StreamAV.as文件同一目录。如果你想把TV和Broadcast模块分开来在不同的目录中,也可以,确保每个目录包含Stream.as文件6 可选,建立
22、一个TV背景,如图6-3所示图6-3. Stage for TV module5. 建立一个TV.as文件,与TV.fla同一目录6. 在TV.as文件中添加以下代码Example 6-4. TV.aspackage import .NetConnection; import flash.events.NetStatusEvent; import flash.media.Video; import flash.display.Sprite; public class TV extends Sprite private var nc:NetConnection; private
23、 var vid:Video; private var rtmpNow:String; private var tvSet:StreamAV; private var good:Boolean; public function TV() nc=new NetConnection ; nc.addEventListener (NetStatusEvent.NET_STATUS,checkConnect); vid=new Video(200,150); vid.x=81; vid.y=76; addChild (vid); rtmpNow=rtmp:/1 /studio;
24、nc.connect (rtmpNow,viewer); /Connection private function checkConnect (e:NetStatusEvent) good=.code = NetConnection.Connect.Success; if (good) tvSet=new StreamAV(nc); tvSet.streamIn (vid,presentation); 当你完成,测试你的广播系统。首先,加载Broadcast模块和运行它。一旦显示“on the air”,你可以准备运行TV模块了。如果你的TV显示从Studio模块广播过来的图像,每
25、个东西都在工作中。同样地,你可也可以听到从stiduo发过来的声音。图6-4. Studio stream seen on TV module你可能注意到了,在脚本中NetConnection.connect()的参数包含一个额外的值。直到现在,你看到在connect()方法中是应用程序的名称(例如,studio)。两个模块都有一个可选的参数。在这里,这个可选参数指示了用”anchor”或者”viewer” 作为标记。依赖于哪个模块正在运行。在服务端,你将会在下一节中学习到,这个可选参数(唯一的)帮助指示谁正在使用应用程序。可能你想要限制谁可以和不可以使用你的应用程序,使用第二个参数与用户识别
26、码,可以非常方便。6.4.1.使用SSAS(服务端脚本)SSAS的书写与在动作面板或者脚本窗口中书写不一样。紧记,这个脚本在服务端运行,依赖于服务器中发生的事件。在开始之前,让我们一起看一下三个事件: 程序开始时 连接到程序时 从程序断开时接受客户端是一个方法,不是一个事件。但是接受一个连接是一个连接进程的一部分。所以在这三个事件外,接受连接也包含在内。当你与服务端的脚本一起工作时,你也想要调试它。为了调试它,像客户端脚本一样,可以使用trace()语句。trace 信息不会出现在输出面板,你必须打开FMS3控制台,选择View Applications-Live Log。Live Log 窗
27、口显示trace()的结果,像图6-5。无论如何,第一步你需要建立SSAS文件。1. 打开一个新的ActionScript通信文件,保存它为studio.asc,存放在服务端studio目录2. 在studio.asc文件中,添加6-5中的代码:Example 6-5. studio.ascapplication.onAppStart = function()/程序启动 trace(The Broadcast has begun!);application.onConnect = function(client,nameNow)/连接上 =nameNow; trace(c
28、 + has connected); application.acceptConnection(client); trace( + has been accepted);application.onDisconnect = function(client)/连接断开 trace( + has left.);脚本使用SSAS,报告在服务端发生了什么。这三个事件捕获包括:程序启动(onAppStart)、客户端连接(onConnect)、客户端断开(onDisconnect)。另外,Application.acceptConnecti
29、on()允许客户端连接。如果使用Application.rejectConnection()方法,客户端将会被拒绝连接。一旦你保存好服务端脚本,打开Broadcast模块。第一个trace结果将出现在FMS3 Administration console,如图6-5所示。当应用程序起动,第一个消息出现。在这个时候你看见应用程序的起动消息,因为,客户端可以进来和出去,而不需要重新启动应用程序。然后你将会看到一个叫”anchor”的客户端已连接上,然后是接受连接的消息。下一步,当你打开Viewer模块,控制台显示”viewer”连接上和接受连接的消息。最后,viewer离开,然后是anchor。到
30、这里,studio应用程序显示0个clients连接上。Figure 6-5. Trace statements in the Administration console现在你已成功的建立了一个接受连接的服务端脚本。这只是让你明白,当一个客户端连接到一个服务器时会发生什么和服务器怎么样来辨认唯一的客户端。6.4.2.设置服务端客户带宽限制让我们来做一些实用的ASC脚本。因为在与视频流和声音流一起工作的时候,控制带宽是非常的重要。你将看到如何对不同的客户端设置不同的带宽限制。这个应用程序将会只有两个客户端:anchor和viewer,所以你可以根据客户端的名称来设置带宽。Broadcast模块
31、只是发送流,Viewer模块只是接收流。使用Client.setBandwidthLimit()方法,你可以指定不同的客户端可使用的,服务端到客户端(server-to-client)和客户端到服务端(client-to-server)带宽。设置的语句的格式如下:client.setBandwidthLimit(s2c, c2s);S2c是服务端到客户端,c2s是客户端到服务端。通过设置不同的值来作为参数,可以根据客户端的名字来赋适当的值。下面的脚本对两个模块设置不同的带宽限制。Example 6-6. studio.ascCode View:application.onAppStart =
32、function() trace(The Broadcast has begun!);application.onConnect = function(client,nameNow) =nameNow; trace( + has connected); application.acceptConnection(client); trace( + has been accepted); var s2c; var c2s; if( = anchor) s2c=1000; c2s= /8; else s2c=/8
33、; c2s=1000; client.setBandwidthLimit(s2c,c2s); trace(s2c); trace(server to client= + client.getBandwidthLimit(1); trace(c2s); trace(client to server= + client.getBandwidthLimit(0); application.onDisconnect = function(client) trace( + has left.);为了测试新的SSAS文件,你必须重新启动应用程序。你可以在FMS3控制台中选择View
34、Applications然后点击Reload Application按纽(带箭头的圆)。图6-6显示了选择的应用程序和重新加载应用程序的按纽。这是移除旧版本的应用程序的缓存和加载新版本的文件。(这个步骤很容易被忽略,往往你的程序的改变没有生效,就是因为没有重新加载应用程序)Figure 6-6. Reload applications before running new server-side scripts重新加载应用程序后客户端的连接会被断开,所以你当你重新加载后,要重新运行anchor和viewer,输出如下:anchor has connectedanchor has been ac
35、cepted1000server to client=100012500client to server=12500viewer has connectedviewer has been accepted12500server to client=125001000client to server=12500现在,两个模块实例也有了不同的带宽限制。客户端到服务端的带宽在Broadcast模块中比较高,因为这个模块必须从客户端发送流到服务器。当你做完这样的调整,你可以优化在你应用程序中使用的带宽数量。总之就是哪个为主哪个多设点吧。6.4.3. 从客户端运行一个服务端动作到目前为止,所有在服务端脚
36、本中使用的事件都是使用Application事件,从服务器中运行的。使用NetConnection.call()函数,你也可以从客户端运行一个服务端的方法,及传递变量到服务端脚本中。例如,动态改变带宽的值,你可以发送一个消息连同值来启动服务端函数和传递值来设置带宽的限制。当你不期望有返回值和发送数据时,通常格式是这样:nc.call(ssFunction, null, arg1, arg2);如果你只是想调用某个函数和不传任何值,你可以使用这种格式:nc.call(ssFunction);On the server-side script, you will need a function t
37、hat “catches” the call from the client side. The client class on the server side is the “catcher” of function calls. The format is:在服务端脚本中,你需要一个函数”catches”从客户端调用。Client 类在服务端是”catches”函数,格式如下:client.funcName = function(arg) /codeFor example:client.setBW = function(ser2c, c2ser) client.setBandwidthLi
38、mit(ser2c, c2ser);如果你正在运行broadcast studio,你需要一个简单地方法来改变带宽的限制,以至于你可以更简单地测试你的应用程序和你想要设置的限制。实际上你控制的是Broadcast Studio模块,所以你不需要担心TV模块。在你可以控制任何在服务端的东西前,你需要改变一下studio.asc 脚本,如下:Example 6-7. studio.ascapplication.onAppStart = function() trace(The Broadcast has begun!); application.onConnect = function(clien
39、t,nameNow) =nameNow; trace( + has connected); application.acceptConnection(client); trace( + has been accepted); client.setBW=function(ser2c, c2ser) client.setBandwidthLimit(ser2c, c2ser); trace(New server to client= + (ser2c*8)+bps); trace(New client to server= + (c
40、2ser*8)+bps); application.onDisconnect = function(client) trace( + has left.);服务端函数从客户端接收两个参数,ser2c和c2ser。这些值用来设置带宽限制。记住在FMS中是bytes,bytes被转换成bits。一个byte是8 bits,所以100 bytes是 800 bits。为了让两端都能一起工作,你需要改变Broadcast.as和Broadcast.fla文件,跟着以下步骤,从旧的中来建立一个新的应用程序:1. 打开Broadcast.fla 和 Broadcast.as,分别另存
41、为BroadcastSetBW.fla 和 BroadcastSetBW.as2. 选择BroadcastSetBW.fla,改变它的文档类为BroadcastSetBW。拖一个List组件到库中,保存文件3. 选择BroadcastSetBW.as文件,输入Example 6-8中的代码。Example 6-8. BroadcastSetBW.asCode View:package import fl.data.DataProvider; import fl.controls.List; import .NetConnection; import flash.events.
42、NetStatusEvent; import flash.media.Camera; import flash.media.Microphone; import flash.media.Video; import flash.display.Sprite; import flash.text.TextField; import flash.events.Event; public class BroadcastSetBW extends Sprite private var nc:NetConnection; private var cam:Camera; private var mic:Mi
43、crophone; private var vid:Video; private var rtmpNow:String; private var onAir:String; private var broadcast:StreamAV; private var good:Boolean; private var txtField:TextField; private var list:List; private var stuff:DataProvider; private var cli2sv:uint; public function BroadcastSetBW () /Set Came
44、ra and Microphone nc=new NetConnection ; nc.addEventListener (NetStatusEvent.NET_STATUS,checkConnect); cam=Camera.getCamera(); cam.setMode (200,150,15); cam.setQuality (0,85); mic=Microphone.getMicrophone(); mic.rate=11; vid=new Video(200,150); vid.x=150; vid.y=90; addChild (vid); txtField=new TextF
45、ield(); txtField.x=155; txtField.y=72; addChild (txtField); doList (); rtmpNow=rtmp:/1 /studio; nc.connect (rtmpNow,anchor); /Connection private function checkConnect (e:NetStatusEvent) good=.code = NetConnection.Connect.Success; if (good) txtField.text=On The Air; broadcast=new Str
46、eamAV(nc); vid.attachCamera (cam); broadcast.streamOut (mic,cam,presentation); /Create List and Data Provider private function doList ():void list=new List(); stuff=new DataProvider(); stuff.addItem (label:Select BW); stuff.addItem (label:Minimum, data:(10000/8); stuff.addItem (label:Small, data:(20
47、000/8); stuff.addItem (label:Medium, data:(50000/8); stuff.addItem (label:Large, data:(/8); list.dataProvider=stuff; list.move(355,90); list.width=65; list.selectedIndex=0; addChild (list); list.addEventListener(Event.CHANGE,changeBW); private function changeBW(e:Event):void cli2sv=list.selectedItem
48、.data; nc.call(setBW,null,100,cli2sv); list.selectedIndex=0; Thus, the only the server-side bandwidth setting that needs to be controlled is the client-to-server bandwidth limit. To see the code making calls to the server in action, the next section explains how to set up a totally dynamic studio, including the module for changing the bandwidth limits.为了更好的看到客户端和服务端的关系,图6-7用箭头指出了相关联的参数。Trace语句显示了参数是否正确传递。因为Broadcast模块不接收任何流,服务端到客户端的设置是静态的。Figure 6-7. Client-side call to server-side function为了更好的看到通过List组件传递的值,表6-1展示了所有用到的值。Tab
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 科学研究领域研究员招聘人员登记表模板范文
- 制造业生产调度与资源配置措施
- 整风运动与团队建设的心得体会
- 餐饮业疫情防控及服务保障措施
- 加油站职业病防护措施的成本与效益分析
- 25年公司项目部安全培训考试试题含答案(满分必刷)
- 2024-2025员工三级安全培训考试试题基础题
- 教师心理健康维护的心得体会
- 初中英语家校合作集体备课方案
- 康复医院护理岗位职责
- 【9数一模】2025年安徽省合肥市蜀山区九年级中考一模数学试卷(含答案)
- 2024年江西省高考化学试卷(真题+答案)
- 田径运动会各种记录表格
- TSG-T7001-2023电梯监督检验和定期检验规则宣贯解读
- 中医培训课件:《中药热奄包技术》
- 报价单(报价单模板)
- jgj t17-2008蒸压加气混凝土建筑应用技术
- 德育主题班会 《遵义会议》教学课件
- 《台阶》评课稿
- 开拓者源码日内高低点突破交易系统
- 信用证开证申请书详细填写说明(一)
评论
0/150
提交评论