存档
(译)Learning Flash Media Server 3中文版-第6章之6/7
6.6. 带宽检测
在FMS3之前,检查你的系统当前的带宽,唯一的方法来是使用服务器端代码和算法。一个非常有趣的新功能是call服务器, checkBandwidth 。由于call是一个内置的功能,您就可以用来客户端代码检查自己的带宽。checkBandwidth命令的调用是在一个NetConnection对象中:
//nc is a NetConnection instance
nc.call ("checkBandwidth",null);
它看起来是call服务端的函数checkBandwidth ,但是在服务端你不需要与任何的代码。虽然你不写这个方法,但它仍然属于服务器端的Client类。你必须写一个特殊的类来得到返回的信息,用两个特殊的方法:onBWCheck和onBWDone 。这个类是被NetConnection.client实例调用的。
6.6.1. 创建Client类
第一步是写一个客户类,包含用来来检查带宽所需要的方法和返回一个值。此外,通过包括getter方法,你可以为你的主类返回带宽。客户端类虽然可以作为你的主类; ,但是还是把它单独开,这样任何其它应用程序都可以很容易的重复使用,当需要获取带宽时。在开始前,建立BWClient.as文件,示例6-10 。这个类是用在NetConnection.client实例上的。
Example 6-10. BWClient.as
Code View:
package
{
class BWClient
{
private var currentBW:Number;
public function onBWCheck (... rest):Number
{
return 0;
}
public function onBWDone (... rest):void
{
if (rest.length>0)
{
currentBW=rest[0];
}
}
public function sendInfo ():Number
{
return currentBW;
}
}
}
...(rest)参数表明可以接受多个参数。第一个方法,onBWCheck 返回0。在NetConnection.call("checkBandwidth", null)时,它担任启动的角色。在这个类中的关键的方法onBWDone。rest[0]元素包含目前带宽的速度(千比特)。为了在主类中能能够做点事情, sendInfo ()方法是一个公共的方法,是主类可以用来取得当前带宽的唯一方法。 下一步, CheckBW类调用客户类(BWClient),提取带宽,并显示给该用户。当然,带宽可以用来做任何调整摄像头和声音的设置,使其他调整来优化FMS3应用程序。输入示例6-11中的代码,并保存为CheckBW.as 。
Example 6-11. CheckBW.as
Code View:
package
{
import flash.display.Sprite;
import flash.net.NetConnection;
import flash.events.NetStatusEvent;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import fl.controls.Button;
public class CheckBW extends Sprite
{
private var nc:NetConnection;
private var rtmpNow:String;
private var good:Boolean;
private var btn:Button;
private var txtFld:TextField;
private var checkUp:Object;
private var currentBW:Number;
public function CheckBW ()
{
btn=new Button();
btn.x=200, btn.y=50;
btn.label="Show Bandwidth";
addChild (btn);
btn.addEventListener (MouseEvent.CLICK,showBW);
txtFld=new TextField();
txtFld.multiline=true;
txtFld.x=200, txtFld.y=80;
txtFld.autoSize = TextFieldAutoSize.LEFT;
addChild (txtFld);
rtmpNow="rtmp://192.168.0.11/studio/";
nc=new NetConnection ;
nc.addEventListener (NetStatusEvent.NET_STATUS,checkNcall);
nc.client=new BWClient();
nc.connect (rtmpNow,"BWsnooper");
checkUp=new Object();
}
private function checkNcall (e:NetStatusEvent):void
{
good=e.info.code == "NetConnection.Connect.Success";
if (good)
{
nc.call ("checkBandwidth",null);
}
}
private function showBW (e:MouseEvent)
{
checkUp.see=nc.client.sendInfo();
if (checkUp.see >0)
{
currentBW=nc.client.sendInfo();
txtFld.text="Your current Bandwidth is "+currentBW +" Kbps.\n";
txtFld.appendText ("That would be about
"+Math.round(currentBW/1000)+ " Megabits per second.");
}
else
{
txtFld.text="Still working.\n";
txtFld.appendText ("Click again in a couple of moments.");
}
}
}
}
CheckBW 类在连接成功后就调用checkBandwidth 方法。为了看到你的带宽是多少,需要点击按纽,它会调用showBW 方法。使用BWClient实例(nc.client)来调用getter方法:sendInfo()。使用一个对像的属性(checkUp.see),储存返回的带宽值,然后传递给currentBW。依次,信息被传递给文本字段。即使在连接成功后就调用checkBandwidth 方法,也要等待一会再会返回信息给客户端。
Figure 6-12. Before and after bandwidth has been returned
(译)Learning Flash Media Server 3中文版-第6章之5/7
6.5. 动态控制 Camera, Microphone, and Bandwidth
你可能很想知道,为什么在最初的广播应用程序中,对Camera和Microphone对像比较少评价。这只不过是把重点放在,用最少的代码创建一个广播型应用。这节中将添加几个组件到Broadcast 模块中。然而,添加这些组件,将消除”studio”的氛围,重点放在更多的不同的组件和他们所做的事情。你将能够看到在TV模块上的图像动态的改变,在你改变不同的组件时。同样地,你可以更好的明白到,所有的设置是多么的重要。竟然如此,你将使用完全相同的TV模块。因为这处应用程序使用不同的组件,主要是用户界面组件,你将会在类列表中看到,比前的例子更多的类和事件。像其它例子一样,你将使用StreamAV 类,所以确保StreamAV.as 文件和新的Broadcast 模块在相同的目录中。
Classes
NetConnection
NetStatusEvent
Camera
Microphone
Video
Sprite
TextField
StreamAV
DataProvider
MovieClip
List
TextInput
Button
Slider
SliderDirection
SliderEvent
RadioButton
RadioButtonGroup
TextField
Event
MouseEvent
Objects
Static Text fields
Drawn rectangle
backdrop_mc (instance)
你会看到,大部分的工作是在该文件BroadcastStudio.as中,动态分配不同的用户界面组件到舞台上。开始前,你需要把几个不同的静态文本放在舞台上,并创建一个影片剪辑对象和使用矩形绘图工具。为了帮助您,图6-9显示所有的对像,及其x和y坐标( X和Y )和两个绘制的对像的尺寸和位置。
Figure 6-9.对像和实例名称
所有的静态文本,使用11号Arial Black字体(您可以代替任何您想要的字体)。请按照下列步骤来建立这个应用程序:
- 新建一个Flash file (ActionScript 3.0),保存它为BroadcastStudio.fla,和StreamAV.as同一目录。舞台尺寸600X500。
- 使用图6-9作为一个参考,添加不同的静态文本到舞台。
- 使用矩形工具,画一个200X150的矩形,圆角9,转为影片剪辑,实例名为backdrop_mc,其它参考图。
- 画那个75 x 21 的矩形,参数参考图
- 打开组件面板,添加以下组件到库面板中:Slider,TextInput, RadioButton, Button, and List。
- 在同一目录下新建一个BroadcastStudio.as
- 在BroadcastStudio.as 文件中输入以下代码。
Example 6-9. BroadcastStudio.as
Code View:
package{import fl.data.DataProvider;import flash.display.MovieClip;import fl.controls.List;import fl.controls.TextInput;import fl.controls.Button;import fl.controls.Slider;import fl.controls.SliderDirection;import fl.events.SliderEvent;import fl.controls.RadioButton;import fl.controls.RadioButtonGroup;import flash.net.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;import flash.events.Event;import flash.events.MouseEvent;public class BroadcastStudio extends Sprite{private var nc:NetConnection;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;//BWprivate var list:List;private var stuff:DataProvider;private var cli2sv:uint;//Cameraprivate var qualBw:TextInput;private var qualQual:TextInput;private var modeW:TextInput;private var modeH:TextInput;private var modeFPS:TextInput;private var keyFrameI:TextInput;private var camBtn:Button;//Microphoneprivate var rateGroup:RadioButtonGroup;private var r5:RadioButton;private var r8:RadioButton;private var r11:RadioButton;private var r22:RadioButton;private var r44:RadioButton;private var silLevelL:TextInput;private var silLevelT:TextInput;private var silL:uint;private var silT:uint;private var mGain:Slider;private var micBtn:Button;public function BroadcastStudio (){//Set Camera and Microphonenc=new NetConnection ;nc.addEventListener (NetStatusEvent.NET_STATUS,checkConnect);//Camera defaultcam=Camera.getCamera();cam.setMode (192,144,15);cam.setQuality (0,85);//qualBw=new TextInput();addChild (qualBw);qualBw.x=20,qualBw.y=35;qualQual=new TextInput();addChild (qualQual);qualQual.x=(qualBw.x+qualBw.width+5),qualQual.y=35,qualQual.width=30;modeW=new TextInput();modeH=new TextInput();//modeFPS=new TextInput();addChild (modeW);modeW.width=30,modeW.x=20,modeW.y=95;addChild (modeH);modeH.width=30,modeH.x=(modeW.x+modeW.width+5),modeH.y=95;addChild (modeFPS);modeFPS.width=30,modeFPS.x=(modeH.x+modeH.width+5),modeFPS.y=95;keyFrameI=new TextInput();addChild (keyFrameI);keyFrameI.width=30,keyFrameI.x=20, keyFrameI.y=155;camBtn=new Button();camBtn.label="Set Camera";addChild (camBtn);camBtn.x=(keyFrameI.width+keyFrameI.x+5),camBtn.y=155,camBtn.addEventListener (MouseEvent.CLICK,setCam);//Microphone defaultmic=Microphone.getMicrophone();mic.rate=11;micBtn=new Button();micBtn.addEventListener (MouseEvent.CLICK,setMic);rateGroup=new RadioButtonGroup("Rate");r5=new RadioButton(),r8=new RadioButton();r11=new RadioButton(),r22=new RadioButton();r44=new RadioButton();r5.move(300,20),r8.move(300,40);r11.move(300,60),r22.move(340,20);r44.move (340,40);r5.label="5",r8.label="8",r11.label="11";r22.label="22",r44.label="44";r5.group=rateGroup,r8.group=rateGroup;r11.group=rateGroup, r22.group=rateGroup;r44.group=rateGroup;addChild(r5),addChild(r8);addChild(r11),addChild(r22);addChild (r44);rateGroup.addEventListener (MouseEvent.CLICK,setMic);silLevelL=new TextInput();silLevelL.move (296,104);silLevelL.width=30;addChild (silLevelL);silLevelT=new TextInput();silLevelT.move (331,104);silLevelT.width=60;addChild (silLevelT);micBtn=new Button();micBtn.move (296,130);micBtn.label="Set Silence Level";addChild (micBtn);micBtn.addEventListener (MouseEvent.CLICK,setSilence);mGain=new Slider();mGain.move (470,20);mGain.minimum=0;mGain.maximum=100;mGain.tickInterval=5;mGain.value=70;mGain.width=100;addChild (mGain);mGain.direction= SliderDirection.VERTICAL;mGain.addEventListener (SliderEvent.CHANGE,setGain);//Video defaultvid=new Video(cam.width,cam.height);vid.x=189;vid.y=228;addChild (vid);txtField=new TextField();txtField.x=190;txtField.y=205;addChild (txtField);doBW ();rtmpNow="rtmp://192.168.0.11 /studio";nc.connect (rtmpNow,"anchor");}//Cwonnectionprivate function checkConnect (e:NetStatusEvent){good=e.info.code == "NetConnection.Connect.Success";if (good){txtField.text="On The Air";broadcast=new StreamAV(nc);vid.attachCamera (cam);broadcast.streamOut (mic,cam,"presentation");}}//Create List and Data Providerprivate function doBW ():void{list=new List();stuff=new DataProvider();stuff.addItem ({label:"Select BW"});stuff.addItem ({label:"Minimum", data:(10000/8)});stuff.addItem ({label:"Small", data:(20000/8)});stuff.addItem ({label:"Medium", data:(50000/8)});stuff.addItem ({label:"Large", data:(100000/8)});list.dataProvider=stuff;list.move (200,20);list.width=65;list.selectedIndex=0;addChild (list);list.addEventListener (Event.CHANGE,changeBW);}//Change the client bandwidthprivate function changeBW (e:Event):void{cli2sv=list.selectedItem.data;nc.call ("setBW",null,100,cli2sv);list.selectedIndex=0;}private function setCam (e:MouseEvent):void{cam.setQuality (Number(qualBw.text),Number(qualQual.text));cam.setMode(Number(modeW.text),Number(modeH.text),Number(modeFPS.text));cam.setKeyFrameInterval (Number(keyFrameI.text));backdrop_mc.width=(cam.width+6);backdrop_mc.height=(cam.height+6);setVid ();}private function setMic (e:MouseEvent):void{mic.rate=Number(rateGroup.selection.label);}private function setSilence (e:MouseEvent):void{silL=Number(silLevelL.text);silT=Number(silLevelT.text);mic.setSilenceLevel (silL,silT);}private function setGain (e:SliderEvent):void{mic.gain=e.target.value;}private function setVid ():void{vid.width=cam.width;vid.height=cam.height;}}}
当你完成,可以测试代码。图6-10显示了你将看到不同的选项填补和改变屏幕的默认值:
Figure 6-10. Dynamic changes in BroadcastStudio module
在这个控制面板,您有很多不同的选项。控制camera的只是一个单一的按钮,所以千万不要留下任何空白选项,当您按下Set Camera 按钮。当前的设置显示了,该模式质量可用带宽的范围。最好的图片是100 Kbits ;图像出现在Broadcast Studio 模块不仅反映了,在模式设置和视频窗口大小之间,不同的图像大小所产生之间的联系。然而,如果您设置的质量为10或100,本地是看不到改变的。而是在流发送到TV模块中。例如,图6-11显示了非常低的带宽设置在相机质量的带宽(只有20 Kbits ) ;如果你比较形象的工作室,在电视模块,你可以看到其中的差别。
Figure 6-11. Studio changes only show up in streamed view
直接连接您的相机到视频对象,会尽可能提供最好质量的图片。您需要使用BroadcastStudio模块和TV模块,才能真正看到所有的效果。例如,尝试优化质量,FPS,以及关键帧间隔(使用一个比较低值的间隔,如5或更少),然后设置带宽最低或small。您的图像就变得很呆板,意思就是很卡,不流畅!
此应用程序的目的是向你显示,你可以用多少低的带宽。举例来说,如果你预期会有更多的观众,你可能想改变TV模块的视频分辨率为160 × 120 (默认)或者少于200 × 150 ,在Quad application 中有做过(5.6.3 在第5章)。最重要的是,此应用程序演示了如何建立一个视频和音频,与许多不同的ActionScript 3.0用户界面组件,每个设置或者组件设置都影响着流应用程序。
(译)Learning Flash Media Server 3中文版-第6章之4/7
6.4.1.使用SSAS(服务端脚本)
SSAS的书写与在动作面板或者脚本窗口中书写不一样。紧记,这个脚本在服务端运行,依赖于服务器中发生的事件。在开始之前,让我们一起看一下三个事件:
· 程序开始时
· 连接到程序时
· 从程序断开时
接受客户端是一个方法,不是一个事件。但是接受一个连接是一个连接进程的一部分。所以在这三个事件外,接受连接也包含在内。当你与服务端的脚本一起工作时,你也想要调试它。为了调试它,像客户端脚本一样,可以使用trace()语句。trace 信息不会出现在输出面板,你必须打开FMS3控制台,选择View Applications->Live Log。Live Log 窗口显示trace()的结果,像图6-5。无论如何,第一步你需要建立SSAS文件。
1. 打开一个新的ActionScript通信文件,保存它为studio.asc,存放在服务端studio目录
2. 在studio.asc文件中,添加6-5中的代码:
Example 6-5. studio.asc
application.onAppStart = function(){//程序启动trace("The Broadcast has begun!");};application.onConnect = function(client,nameNow){//连接上client.name=nameNow;trace(client.name + " has connected");application.acceptConnection(client);trace(client.name + " has been accepted");}application.onDisconnect = function(client){//连接断开trace(client.name + " has left.");}
脚本使用SSAS,报告在服务端发生了什么。这三个事件捕获包括:程序启动(onAppStart)、客户端连接(onConnect)、客户端断开(onDisconnect)。另外,Application.acceptConnection()允许客户端连接。如果使用Application.rejectConnection()方法,客户端将会被拒绝连接。
一旦你保存好服务端脚本,打开Broadcast模块。第一个trace结果将出现在FMS3 Administration console,如图6-5所示。当应用程序起动,第一个消息出现。在这个时候你看见应用程序的起动消息,因为,客户端可以进来和出去,而不需要重新启动应用程序。然后你将会看到一个叫”anchor”的客户端已连接上,然后是接受连接的消息。下一步,当你打开Viewer模块,控制台显示”viewer”连接上和接受连接的消息。最后,viewer离开,然后是anchor。到这里,studio应用程序显示0个clients连接上。
Figure 6-5. Trace statements in the Administration console
现在你已成功的建立了一个接受连接的服务端脚本。这只是让你明白,当一个客户端连接到一个服务器时会发生什么和服务器怎么样来辨认唯一的客户端。
6.4.2.设置服务端客户带宽限制
让我们来做一些实用的ASC脚本。因为在与视频流和声音流一起工作的时候,控制带宽是非常的重要。你将看到如何对不同的客户端设置不同的带宽限制。这个应用程序将会只有两个客户端:anchor和viewer,所以你可以根据客户端的名称来设置带宽。Broadcast模块只是发送流,Viewer模块只是接收流。
使用Client.setBandwidthLimit()方法,你可以指定不同的客户端可使用的,服务端到客户端(server-to-client)和客户端到服务端(client-to-server)带宽。设置的语句的格式如下:
client.setBandwidthLimit(s2c, c2s);
S2c是服务端到客户端,c2s是客户端到服务端。通过设置不同的值来作为参数,可以根据客户端的名字来赋适当的值。下面的脚本对两个模块设置不同的带宽限制。
Example 6-6. studio.asc
Code View:
application.onAppStart = function(){trace("The Broadcast has begun!");};application.onConnect = function(client,nameNow){client.name=nameNow;trace(client.name + " has connected");application.acceptConnection(client);trace(client.name + " has been accepted");var s2c;var c2s;if(client.name == "anchor"){s2c=1000;c2s= 100000/8;}else{s2c=100000/8;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(client.name + " has left.");}
为了测试新的SSAS文件,你必须重新启动应用程序。你可以在FMS3控制台中选择View Applications然后点击Reload Application按纽(带箭头的圆)。![]()
图6-6显示了选择的应用程序和重新加载应用程序的按纽。这是移除旧版本的应用程序的缓存和加载新版本的文件。(这个步骤很容易被忽略,往往你的程序的改变没有生效,就是因为没有重新加载应用程序)
Figure 6-6. Reload applications before running new server-side scripts
重新加载应用程序后客户端的连接会被断开,所以你当你重新加载后,要重新运行anchor和viewer,输出如下:
anchor has connected
anchor has been accepted
1000
server to client=1000
12500
client to server=12500
viewer has connected
viewer has been accepted
12500
server to client=12500
1000
client to server=12500
现在,两个模块实例也有了不同的带宽限制。客户端到服务端的带宽在Broadcast模块中比较高,因为这个模块必须从客户端发送流到服务器。当你做完这样的调整,你可以优化在你应用程序中使用的带宽数量。总之就是哪个为主哪个多设点吧。
6.4.3. 从客户端运行一个服务端动作
到目前为止,所有在服务端脚本中使用的事件都是使用Application事件,从服务器中运行的。使用NetConnection.call()函数,你也可以从客户端运行一个服务端的方法,及传递变量到服务端脚本中。例如,动态改变带宽的值,你可以发送一个消息连同值来启动服务端函数和传递值来设置带宽的限制。当你不期望有返回值和发送数据时,通常格式是这样:
nc.call("ssFunction", null, arg1, arg2);
nc.call("ssFunction");
On the server-side script, you will need a function that “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) {//code}For example:
client.setBW = function(ser2c, c2ser) {client.setBandwidthLimit(ser2c, c2ser);}
如果你正在运行broadcast studio,你需要一个简单地方法来改变带宽的限制,以至于你可以更简单地测试你的应用程序和你想要设置的限制。实际上你控制的是Broadcast Studio模块,所以你不需要担心TV模块。在你可以控制任何在服务端的东西前,你需要改变一下studio.asc 脚本,如下:
Example 6-7. studio.asc
application.onAppStart = function(){trace("The Broadcast has begun!");};application.onConnect = function(client,nameNow){client.name=nameNow;trace(client.name + " has connected");application.acceptConnection(client);trace(client.name + " 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= " + (c2ser*8)+"bps");}}application.onDisconnect = function(client){trace(client.name + " has left.");}
服务端函数从客户端接收两个参数,ser2c和c2ser。这些值用来设置带宽限制。记住在FMS中是bytes,bytes被转换成bits。一个byte是8 bits,所以100 bytes是 800 bits。
为了让两端都能一起工作,你需要改变Broadcast.as和Broadcast.fla文件,跟着以下步骤,从旧的中来建立一个新的应用程序:
1. 打开Broadcast.fla 和 Broadcast.as,分别另存为BroadcastSetBW.fla 和 BroadcastSetBW.as
2. 选择BroadcastSetBW.fla,改变它的文档类为BroadcastSetBW。拖一个List组件到库中,保存文件
3. 选择BroadcastSetBW.as文件,输入Example 6-8中的代码。
Example 6-8. BroadcastSetBW.as
Code View:
package{import fl.data.DataProvider;import fl.controls.List;import flash.net.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;import flash.events.Event;public class BroadcastSetBW extends Sprite{private var nc:NetConnection;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;private var list:List;private var stuff:DataProvider;private var cli2sv:uint;public function BroadcastSetBW (){//Set Camera and Microphonenc=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 TextField();txtField.x=155;txtField.y=72;addChild (txtField);doList ();rtmpNow="rtmp://192.168.0.11 /studio";nc.connect (rtmpNow,"anchor");}//Connectionprivate function checkConnect (e:NetStatusEvent){good=e.info.code == "NetConnection.Connect.Success";if (good){txtField.text="On The Air";broadcast=new StreamAV(nc);vid.attachCamera (cam);broadcast.streamOut (mic,cam,"presentation");}}//Create List and Data Providerprivate 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:(20000/8)});stuff.addItem ({label:"Medium", data:(50000/8)});stuff.addItem ({label:"Large", data:(100000/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.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展示了所有用到的值。
Table 6-1. List labels and data values
所有的值都是设置成bps(bits每秒),注意,因为带宽是以bits为标准的,不是字节。所以在这里,提供的比率最小是10 Kbps,最大是100 Kbps。图6-8展示了你可将在Broadcast模块中看到的:
Figure 6-8. Broadcast module showing List component for changing bandwidth limits
To see the effect that changing bandwidth limits has on the studio and TV modules, test the TV module with the new studio module. The default bandwidth setting works well. But as you keep decreasing bandwidth for the studio to use to send a stream to the TV module, you will experience freezing. As you increase the bandwidth limits, the freezing and latency disappears. Try experimenting with this module to get a feel for how the changes, especially the latency and freezes, affect the application.
Adobe FMS 3.5
增强的API和录制高清视频(HD)http://www.adobe.com/devnet/logged_in/ktowes_fms35.html
AmfPhp与MySql工作的问题
今天晚上被它们两个要搞晕了
在a表中有 in,out,date,id 等字段,在phpMyAdmin中可以插入数据。
在amfphp中测试就是添加不了数据,
后来通过排除法,终于找到原因了,
把in字段名改成in_,out改成out_后就可以了。。。。。。。。。。。
(转)Adobe CS4 软件的离线帮助文件路径
查看帮助可以看看以下路径。
Mac OS:
/Library/Application Support/Adobe/Help/en_US/
Windows:
X:\Program Files\Common Files\Adobe\Help\en_US\
在 CS4 软件的 Connections 面板中设置 offline 模式,默认打开的就是本地帮助文件了
