打印

[其它] as3向fms上录制视频问题,奇怪

网上很多关于fms的简单教程,不过as2占绝大多数,刚刚我试了一下as3,发现一个问题。

我就是要实现一个在线录制视频的功能,开始录制之前已经设置了objectEncoding并连接到了服务器而且成功,然后调用函数:
复制内容到剪贴板
代码:
function recFLV(){
    var ns:NetStream = new NetStream(nc);
    ns.addEventListener(NetStatusEvent.NET_STATUS, TypeStatus);
    var v:Video = new Video();
    addChild(v);
    var cam:Camera =  Camera.getCamera();
    v.attachCamera(cam);  //??????
    ns.attachCamera(cam);  //??????
    ns.publish ("123","record");
}
本地视频可以播放,但是服务器上没有文件生成。打开fms2_console发现,在“streams”页面只有一个名为“123”、类型为“live”的项目。

于是我从上到下逐条测试发现,上面代码的第一句执行后,已经在服务器上创建了一个流,名称类似“BDAO4UXG”,类型为“NetStream”。如果继续向下执行,到两条attachCamera()方法时,无论哪一条都会使前面已经创建的流消失,最后导致调用publish()时,视频文件无法创建。

这到底是为什么?如果是as2语法并发布以后,一点问题都没有。

[ 本帖最后由 youxiazhu 于 2007-10-20 09:07 编辑 ]
学习
做了一下改动,终于可以了,但是不明白为什么:

原来在函数recFLV()中定义NetStream类对象ns,现在改在函数外定义,函数内创建实际对象
复制内容到剪贴板
代码:
var ns:NetStream ;
function recFLV(){
     ns = new NetStream(nc);
    ns.addEventListener(NetStatusEvent.NET_STATUS, TypeStatus);
    var v:Video = new Video();
    addChild(v);
    var cam:Camera =  Camera.getCamera();
    v.attachCamera(cam);  //??????
    ns.attachCamera(cam);  //??????
    ns.publish ("123","record");
}
这样居然就可以了!因为调用recFLV()是在连接成功以后做的,我本意是如果NetConnection对象连接不成功,就不必创建ns对象,因而将ns定义放在了recFLV()里面。不过将ns定义为全局和局部两者有什么差别吗?为什么定义为局部变量,就不能形成数据流呢?
学习
AS2里面也是同样的,那是因为开始你的NetStream对象是函数局部的,只要执行完recFLV函数最后一句话后,这个实例就会被清空,当然就没有连接了
我很丑,但很温柔。
我很笨,但很勤奋。
我很穷,但很从容。