【问题标题】:In AS3 while using NetStream for video playback how do I seek when I use appendBytes在 AS3 中使用 NetStream 进行视频播放时,当我使用 appendBytes 时如何寻找
【发布时间】:2011-04-19 00:20:33
【问题描述】:

我正在尝试使用 NetStream 从 byteArray 播放。请参阅this 了解我在说什么。

我可以用它来播放视频。但是现在我需要能够看到特定的秒数。我无法做到这一点。如果我通过字节数组,我知道我可以根据需要获取元数据和关键帧,以及每个关键帧所在位置的偏移量(以字节为单位)。但是,没有办法找到特定的偏移量。它仅支持几秒钟内的搜索,并且似乎不适用于 byteArray。

我该怎么做?

【问题讨论】:

    标签: actionscript-3 flv netstream


    【解决方案1】:

    我得到了我的工作:

    // 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;
        }
    }​
    

    【讨论】:

      【解决方案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】:

        尝试 my code posted here 示例,了解如何在 FLV 元数据中不存在“关键帧”等情况下完成搜索。还有一个 working demo 可用于测试(使用 H264 和 AAC/MP3 音频的 FLV)。

        该代码部分发送给 answer this question(如果您需要其他信息/上下文)

        【讨论】:

          猜你喜欢
          • 2013-05-11
          • 1970-01-01
          • 2012-12-31
          • 1970-01-01
          • 2014-12-29
          • 2012-08-13
          • 2018-06-18
          • 1970-01-01
          • 2014-05-13
          相关资源
          最近更新 更多