我正在尝试将网络摄像头的视频发布到Flash Media Server 2。 我的代码在Flash独立播放器(使用10.0和10.2测试)中工作,但不在浏览器插件中(在IE和Opera中都使用10.2测试)。 与我的FMS的连接工作成功,但在发布后,没有任何反应,我从来没有得到NetStream.Publish.Start事件。在服务器上,我可以在管理控制台中看到连接,甚至是流选项卡中的流。但我无法连接到那条线。
任何人都知道可能出现什么问题?
NetConnection.defaultObjectEncoding = ObjectEncoding.AMF0; // needed to get correct connection to FMS2
private function netStatusHandler(event:NetStatusEvent):void {
output.appendText("\n" + event.info.code);
switch (event.info.code) {
case "NetConnection.Connect.Success":
output.text = ("Connection successful, streaming camera...");
connectCamera();
break;
case "NetConnection.Connect.Failed":
break;
case "NetStream.Play.StreamNotFound":
break;
case "NetStream.Publish.Start":
output.appendText("\nPublishing video!");
break;
}
}
private function connectCamera(ev:Event = null):void {
var stream:NetStream = new NetStream(connection);
stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
stream.attachCamera(camera);
videoURL = createGUID();
stream.publish(videoURL, "live");
output.text = "publish stream...";
}
答案 0 :(得分:1)
好的,我发现我的问题在这里: 我在connectCamera函数中声明了对 stream 变量的引用:
private function connectCamera(ev:Event = null):void {
var stream:NetStream = new NetStream(connection);
}
所以 stream 只在该函数的范围内声明。 这在独立播放器中似乎不是问题,但它在浏览器插件中。浏览器插件似乎在垃圾收集器上做了更多的工作,在函数执行后垃圾收集我的流。 所以我要做的是在类范围内的函数范围之外声明 stream 变量。
var stream:NetStream;
private function connectCamera(ev:Event = null):void {
stream = new NetStream(connection);
}
你应该总是将你以后需要的东西声明为你班级的一个字段,而不是在一个函数里面。你永远不知道GC什么时候可以清理那些东西。