2010-09-29 27 views
2

J'essaie d'utiliser NetStream pour jouer à partir d'un byteArray. S'il vous plaît voir this pour ce dont je parle.Dans AS3 tout en utilisant NetStream pour la lecture vidéo comment puis-je chercher quand j'utilise appendBytes

Je peux obtenir ceci pour lire la vidéo. Cependant maintenant je dois être capable de voir à une seconde particulière. Je ne suis pas capable de faire ça. Si je passe par le bytearray, je sais que je peux obtenir les métadonnées et les images clés au besoin et le décalage (en octets) quant à l'emplacement de chaque image clé. Cependant, il n'y a aucun moyen de chercher un décalage particulier. Il ne supporte que seek en secondes et cela ne semble pas fonctionner sur byteArray.

Comment procéder?

Répondre

2

Chaque étiquette flv a un horodatage et un décalage. Vous pouvez trouver la spécification FLV ici: http://download.macromedia.com/f4v/video_file_format_spec_v10_1.pdf

Vous ne pouvez lire la vidéo à aucune position. Vous devez commencer au début d'une balise, vous devrez donc trouver l'étiquette avec l'heure la plus proche de l'heure à laquelle vous voulez chercher.

Votre va vouloir faire quelque chose comme ceci:

private var tags:Array = []; 
private var fileStream:FileStream; 
private var netStream:NetStream; 
private var seekTime:Number; 

public function function readTags(path:String):void 
{ 
    //open the fileStream for reading 

    while(fileStream.bytesAvailable > 0) 
    { 
     //sudo code for reading the tags of an FLV 

     var tagPosition:int = fileStream.position; 
     var tagSize:int = //Read the tag size; 
     var timestamp:int = //read the timestamp; 
     tags.push({timestamp:timestamp, position:tagPosition}]; 
     fileStream.position += tagSize; //goto the next tag 
    } 
} 

private function findTagPosition(timeInMilliseconds:int):int 
{ 
    //Search the tags array for the tags[a].timestamp that is nearest to timeInMilliseconds 

    return tags[indexOfTagNearstToTimeInMilliseconds].position; 
} 

public function seek(time:Number):void 
{ 
    seektime = time; 
    netStream.seak(time); 
} 

private function onNetStatusEvent(event:NetStatusEvent):void 
{ 
    if(event.info.code == NetStreamCodes.NETSTREAM_SEEK_NOTIFY) 
    { 
     fileStream.position = findTagPosition(seekTime * 1000); 
     netStream.appendBytesAction(NetStreamAppendBytesAction.RESET_SEEK); 
     var bytes:ByteArray = new ByteArray(); 
     fileStream.readBytes(bytes); 
     netStream.appendBytes(bytes); 
    } 
} 
3

je suis arrivé, je travaillais:

// onmetadata function get all timestamp and corresponding fileposition.. 

function onMetaData(infoObject: Object): void { 

    for (var propName: String in infoObject) { 

     if (propName == "keyframes") { 
      var kfObject: Object = infoObject[propName]; 
      var timeArr: Array = kfObject["times"]; 
      var byteArr: Array = kfObject["filepositions"]; 

      for (var i: int = 0;i < timeArr.length;i++) { 
       var tagPos: int = byteArr[i]; //Read the tag size; 
       var timestamp: Number = timeArr[i]; //read the timestamp; 
       tags.push({ 
        timestamp: timestamp, 
        tagPos: tagPos 
       }); 

      } 
     } 

// onseek click get approximate timestamp and its fileposition 
protected 

function seek_click(seektime: Number): void { 

    var cTime: Number = 0; 
    var pTime: Number = 0; 

    for (var i: int = 1;i < tags.length;i++) { 
     cTime = tags[i].timestamp; 
     pTime = tags[i - 1].timestamp; 

     if (pTime < seektime) { 
      if (seektime < cTime) { 
       seekPos = tags[i - 1].tagPos; 
       stream.seek(pTime); 
       break; 
      } 
     } 
    } 
} 

/// append bytes on seekposition 
private 

function netStatusHandler(event: NetStatusEvent): void { 

    switch (event.info.code) { 

    case "NetStream.Seek.Notify": 
     stream.appendBytesAction(NetStreamAppendBytesAction.RESET_SEEK); 

     totalByteArray.position = seekPos; 

     var bytes: ByteArray = new ByteArray(); 
     totalByteArray.readBytes(bytes); 
     stream.appendBytes(bytes); 

     stream.resume(); 
     break; 
    } 
}​ 
0

Essayez my code posted here pour un exemple de la façon dont la recherche se fait sans avoir besoin « keyframes » disponible dans les métadonnées FLV etc. Il existe également un working demo disponible pour tester (utiliser FLV avec H264 et audio AAC/MP3).

Ce code a été en partie answer this question (si vous avez besoin d'info/contexte supplémentaire)