2009-08-05 44 views
2

我已经得到了一个N​​etConnection和NetStream设置和流媒体MP3播放罚款。唯一的问题是即使设置了NetStream的客户端,也不会收到元数据。任何想法可能造成这种情况?flash.net.NetStream没有收到onMetaData

代码片段:

 

// 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"); 
    } 
} 
+0

有趣的我不知道,你可以通过NetStream的播放mp3 ... – jayarjo 2011-01-16 11:26:43

回答

0

的netStream.play()调用之前补充一点:

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

工作的呢?

+0

这种方法是确定的AS2,但你不能做到这一点的AS3除非类是动态的。这就是为什么要使用NetStream的客户端属性。 – Boon 2009-08-05 15:23:08

0
var client:Object = new Object(); 
client.onMetaData = function(metadata:Object):void { 
    trace(metadata.duration); 
}; 
videoStream.client = client; 
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); 
} 

我说的对中假设你使用柔性的例子吗?

0

你的代码看起来很好,有时候flash不能读取文件的元数据。它发生在我的FLV视频。只需从更好的节目中获得输出,后期解决我的视频问题。而最后一件事情,如果你做错了,你可以检查loadermax。

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

1

我觉得有可能是具有安全限制的问题 - 闪存不同的“内容”和“数据”,内容(音频,视频,图像),从另一个域名,但此域中的数据连演是unaccesible 。音频或视频是内容,但元数据是数据。它类似于图像的情况:您可以加载和显示来自其他域的图像,但无法读取其bitmapData。跨域应该解决它

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); 
}