2010-09-29 73 views
2

我想用NetStream從byteArray播放。請參閱this瞭解我所談論的內容。在使用NetStream進行視頻播放的AS3中我該如何尋找當我使用appendBytes

我能夠得到這個播放視頻。但是現在我需要能夠看到特定的秒鐘。我無法做到這一點。如果我通過bytearray,我知道我可以根據需要獲取元數據和關鍵幀,以及每個關鍵幀所在的偏移量(以字節爲單位)。但是,沒有辦法尋求特定的抵消。它只支持在幾秒鐘內尋找,似乎不能在byteArray上工作。

我該如何解決這個問題?

回答

2

每個flv標籤都有一個時間戳和偏移量。 您可以在這裏找到FLV規範:http://download.macromedia.com/f4v/video_file_format_spec_v10_1.pdf

您無法在任何位置播放視頻。您必須從標籤的開始處開始,因此您需要找到最接近您要查找的時間的標籤。

你會想要做這樣的事情:

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

我有我的工作:

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

嘗試my code posted here爲追求的是如何操作的實例,而無需「關鍵幀」存在於FLV元數據等中。還有一個可用於測試的FLASH(使用帶有H264和AAC/MP3音頻的FLV)。

該代碼部分是要answer this question(如果需要其他信息/上下文)

相關問題