flash.net.NetStream没有收到onMetaData

时间:2009-08-05 04:16:49

标签: flash audio-streaming flash-media-server

我已经设置了NetConnection和NetStream,并且流式mp3播放正常。唯一的问题是即使已经设置了NetStream的客户端,也不会收到元数据。知道是什么导致了这个吗?

代码段:


// set up NetConnection
...

private function netStatusHandler(e:NetStatusEvent):void 
{
  if (e.info.code == "NetConnection.Connect.Success")
  {
    // NetConnection's connection established successfully
    netStream = new NetStream(nc);
    netStream.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
    netStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
    netStream.client = new NetStreamClient();

    netStream.play("mp3:music/123456");
  }
}

class NetStreamClient
{   
  public function onMetaData(info:Object):void
  {
    trace("onMetaData");
  }

  public function onPlayStatus(info:Object):void
  {
    trace("onPlayStatus");
  }
}

6 个答案:

答案 0 :(得分:1)

在netStream.play()调用之前

添加:

netStream.onMetaData = function(infoObject:Object) {
    trace('on metadata:');
    for (var propName:String in infoObject) {
        trace(propName + " = " + infoObject[propName]);
    }
};

这有用吗?

答案 1 :(得分:1)

我认为安全限制可能存在问题 - 闪存不同“内容”和“数据”,内容(音频,视频,图像)甚至可以从其他域播放,但来自此域的数据无法访问。音频或视频是内容,但元数据是数据。它与图像的情况类似:您可以从另一个域加载和显示图像,但无法读取其bitmapData。 Crossdomain应该解决它

答案 2 :(得分:1)

我有同样的问题,但这段代码会有所帮助。

private var videoURL:String="video.flv";
private function connectStream():void 
    {

        var objClient:Object=new Object();
        objClient.onMetaData=objFunction;

        stream = new NetStream(connection);
        stream.client=function objClient():void{};
        stream.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler);
        stream.addEventListener(AsyncErrorEvent.ASYNC_ERROR,asyncErrorHandler);
        var video:Video = new Video();
        video.attachNetStream(stream);
        video.y=50;
        video.x=50;
        stream.play(videoURL);
}

答案 3 :(得分:0)

var client:Object = new Object( );
client.onMetaData = function(metadata:Object):void {
    trace(metadata.duration);
};
videoStream.client = client;

答案 4 :(得分:0)

问题是

  
      
  • 在调用
    之后触发元数据事件侦听器   NetStream.play()方法,但在之前   视频播放头已经发展。
  •   
  • 不应将类嵌套And you cannot have multiple classes in the same file
  •   
  • 您可以在播放后立即调用暂停方法   触发元数据事件的目的。
  •   

onMetaData用法的一个例子

var video:Video = new Video();
addChild(video);    
var nc:NetConnection = new NetConnection();
nc.connect(null);

var ns:NetStream = new NetStream(nc);
ns.client = {};
ns.client.onMetaData = ns_onMetaData;
ns.client.onCuePoint = ns_onCuePoint;
ns.play("http://www.helpexamples.com/flash/video/cuepoints.flv");

video.attachNetStream(ns);

function ns_onMetaData(item:Object):void {
    trace("metaData");
    // Resize video instance.
    video.width = item.width;
    video.height = item.height;
    // Center video instance on Stage.
    video.x = (stage.stageWidth - video.width) / 2;
    video.y = (stage.stageHeight - video.height) / 2;
}

function ns_onCuePoint(item:Object):void {
    trace("cuePoint");
    trace(item.name + "\t" + item.time);
}

我是否正确地假设您正在使用flex?

答案 5 :(得分:0)

你的代码看起来很好,有时候flash无法读取文件的元数据。它发生在我的flv视频上。只是从更好的程序获得输出,后效解决我的视频问题。最后一件事,如果你认为你做错了,你可以检查loadermax。

http://www.greensock.com/loadermax/