代码改变世界

FMS学习笔记

2010-12-06 11:22  hbb  阅读(680)  评论(0编辑  收藏  举报

不知道几多年前的老古董了...学了个半途而废,不管怎么样贴出来,就当个备份吧 orz

 

 

一、开始
FMS3分3个版本。
FMIS3 全功能版本,I代表Interactive。
FMSS3 视听版,比如没有录制功能,S代表Streaming。
FMDS3 开发版,功能全,但连接有限制,且不能用于商业用途。D代表Development。

FMS程序的根目录。
C:\Program Files\Adobe\Flash Media Server 3\applications

安装目录中有足够的帮助文档。
C:\Program Files\Adobe\Flash Media Server 3\documentation


二、录制和回放

流与广播在性质上是从属关系。
传统广播即一个源,建立一个流,所有用户都连接上这个流。
而FMS的广播,则是为每个用户建立一个流。

下载式、流下载式、流式
下载式,指早期ftp下载电影,下完一个看一个。
流下载式,指迅雷下载电影,边下边看。看完,文件早就下好了。
流式,比流下载式更直接,而且不会有文件生成。


连接服务器时,FMS3的对象编码,也是AS3的缺省设置是AMF3。如果是连接老版本服务器,对象编码要改为AMF0。
NetConnection.defaultObjectEncoding = flash.net.ObjectEncoding.AMF0;


通过下句监听链接状态:
nc.addEventListener (NetStatusEvent.NET_STATUS, checkConnect);

链接地址以rtmp协议开头,后面分两种形式
一种服务器和客户端都是本机
nc.connect ( "rtmp:/vid2/recordings" );

单斜杠后,是程序路径,即服务器安装目录/applications/vid2/recordings

另一种通过域名连接到指定服务器
nc.connect ( "rtmp://192.168.0.11/vid2/recordings" );

双斜杠后,内容一样。

NetStream的定义必须放在连接成功后
function checkConnect (e:NetStatusEvent):void
{
   msg=(e.info.code=="NetConnection.Connect.Success");
   if (msg)
      ns = new NetStream(nc);
}

定义好的 NetStream 即使用不到,也需要设置onMedaData,否则会运行期报错。虽然不影响程序执行...
ns = new NetStream(nc);
ns.client = {
   onMedaData = function(medadata:Object):void{}
};

类似的回调函数还有 onXMPData 等等...


通过下句实现录制:

ns.publish ("name", "record");

name 是文件名。
record 是指定发布规则为录制。

在录制结束时,需要调用 ns.close (),否则文件不会在服务器端保存。

 

如果是FMSS,是没法实现在线录制的,但线下录制有工具 Flash Media Live Encoder 可以实现。

 

三、设置摄像头和麦克风

摄像头和麦克风都是通过静态方法获得实例的

cam = Camera.getCamera([index]);
mic = Microphone.getMicrophone([index]);

可选参数是当有多个选择时,可以代码选定。也可以通过播放器设置面板,手动选择。

摄像头的常见比例
160 x 120
176 x 144
320 x 240
360 x 240
352 x 288
640 x 480

都是4:3的比例,因为FMS3对该比例作了优化。其它比例如何去设置,看:
http://flash-communications.net/technotes/setMode/

 

影响摄像头质量的函数
Camera.setKeyFrameInterval()
Camera.setMode()
Camera.setMotionLevel()
Camera.setQuality()

影响麦克风质量的属性和函数
Microphone.rate
Microphone.gain
Microphone.setSilenceLevel()
Microphone.setUseEchoSuppression()

质量和带宽成反比,需要寻找平衡点。
同样影响带宽的因素还有:
fps        越高,每秒传输的数据越多。
宽高       越大,需要传输的数据越多。
活动等级   麦克风的静音等级,摄像头的活动等级。活动越频繁,传输的数据越多。


可以利用FMLE,帮助调整摄像头和麦克风。

 

四、临时远程共享对象

远程共享对象,即在服务器端创建一个对象。
临时,则说明这个对象像个变量,用户一旦断开链接,对象就被销毁了。
永久,则像是个数据库,一旦创建,就一直存在于服务器上了。

通过下句得到临时性远程共享对象:

so = SharedObject.getRemote("name", nc.uri, false);

name 是共享对象的名称。
nc.uri 是远程服务器连接。
false 是指非永久性,即临时性。


通过下句为共享对象设置属性变量:

so.setProperty("cliName", name_txt.text);

该方法据说有别于早期的FMS。


检测共享对象有两个重要内容:

SyncEvent 是当客户端连接到服务器端的共享对象时,或者共享对象中有属性被改变时触发的事件。

changeList 在SyncEvent触发时,该事件带有一个属性SyncEvent.changeList,是用来存放共享对象中所有属性的。
changeList还带有一个属性 code,表示事件发生的类型。
如果第一次连接上共享对象,code值为"clear"。如果客户端成功的改变了共享对象的某个属性,code值为"success",同时其它客户端的code值为"change"。