2009-08-05 10 views
2

J'ai obtenu un NetConnection et NetStream mis en place et le streaming mp3 joue bien. Le seul problème est que les métadonnées ne sont pas reçues même si le client NetStream a été défini. Une idée de ce qui aurait pu causer ça?flash.net.NetStream ne reçoit pas onMetaData

Extrait de code:

 

// 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

Intéressant Je ne savais pas que vous pouvez jouer mp3 par NetStream ... – jayarjo

Répondre

0

avant la netStream.play() a ajouter ceci:

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

ce travail?

+0

Cette approche est ok pour AS2, mais vous n'êtes pas autorisé à le faire pour AS3 à moins que la classe est dynamique. C'est pourquoi la propriété client de NetStream est utilisée à la place. – Boon

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

Le problème est

  • L'écouteur d'événement de métadonnées est déclenchée après un appel à la méthode
    NetStream.play(), mais avant
    la tête de lecture vidéo a avancé.
  • Les classes ne doivent pas être imbriquées And you cannot have multiple classes in the same file.
  • Vous pouvez appeler une méthode de pause immédiatement après la lecture juste pour le but de déclencher un événement de métadonnées.

Un exemple d'utilisation 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); 
} 

Je suis juste en supposant que vous utilisez flex?

0

Votre code semble bien, la chose est flash ne peut pas lire les métadonnées des fichiers parfois. Cela m'est arrivé sur des vidéos flv. Juste obtenir la sortie du meilleur programme, aftereffects résoudre mes problèmes pour les vidéos. Et dernière chose si vous pensez que vous faites quelque chose de mal, vous pouvez vérifier loadermax.

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

1

Je pense qu'il pourrait y avoir problème avec des restrictions de sécurité - flash diffère « contenu » et « données », le contenu (audio, vidéo, image) est joué même d'un autre domaine, mais les données de ce domaine sont unaccesible . L'audio ou la vidéo sont des contenus mais les méta-données sont des données. Il est similaire à la situation avec des images: vous pouvez charger et afficher l'image d'un autre domaine mais vous ne pouvez pas lire son bitmapData. Crossdomain devrait le résoudre

1

J'ai eu le même problème mais ce code aidera.

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