2013-05-16 17 views
1

Я знаю, что есть много способов, чтобы играть файл FLV, но с учетом моих требований проекта, мне нужно играть FLV, используя URLStream и NetStreamиграть FLV с помощью Netstream appendBytes

Вот полный пример кода, который я делаю мои тесты по:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.NetStatusEvent; 
    import flash.events.ProgressEvent; 
    import flash.utils.ByteArray; 
    import flash.net.URLRequest; 
    import flash.net.URLLoader; 
    import flash.net.URLLoaderDataFormat; 
    import flash.net.NetStreamAppendBytesAction; 
    import flash.net.NetConnection; 
    import flash.net.NetStream; 
    import flash.media.Video; 
    import flash.net.URLStream; 

    /** 
    * ... 
    * @author Hadi Tavakoli 
    */ 
    public class Main extends Sprite 
    { 
     private var netConnection:NetConnection; 
     private var netStream:NetStream; 
     private var ul:URLStream; 
     private var video:Video; 
     private var bytes:ByteArray = new ByteArray(); 
     private var _isSeek:Boolean = false; 

     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 
      // entry point 

      video = new Video(); 
      addChild(video); 

      netConnection = new NetConnection(); 
      netConnection.addEventListener(NetStatusEvent.NET_STATUS, netConnectionStatusHandler); 
      netConnection.connect(null); 
     } 

     private function netConnectionStatusHandler(ev:NetStatusEvent):void 
     { 
      switch(ev.info.code) 
      { 
       case 'NetConnection.Connect.Success': 

        ul = new URLStream(); 
        ul.addEventListener(ProgressEvent.PROGRESS, onProgress); 
        ul.load(new URLRequest('01.flv')); 

       break; 
      } 
     } 

     private function onProgress(e:ProgressEvent):void 
     { 
      ul.readBytes(bytes, bytes.length); 

      if (!netStream) 
      { 
       netStream = new NetStream(netConnection); 
       netStream.client = { }; 
       video.attachNetStream(netStream); 
       netStream.play(null); 
       trace("BEGIN") 
       netStream.appendBytesAction(NetStreamAppendBytesAction.RESET_BEGIN); 
      } 
      else 
      { 
       if (!_isSeek) 
       { 
        trace("SEEK") 
       netStream.appendBytesAction(NetStreamAppendBytesAction.RESET_SEEK); 
        _isSeek = true; 
       } 
      } 

      if (bytes.length == e.bytesTotal) 
      { 
       trace("END") 
      netStream.appendBytesAction(NetStreamAppendBytesAction.END_SEQUENCE); 
      } 

      netStream.appendBytes(bytes); 
      trace("-") 
     } 
    } 
} 

Я не уверен, что я правильно использую метод «appendBytes»? видео показывается, но будет воспроизводиться только несколько первых кадров, а затем прекратится видео!

в моих глазах кажется все в порядке! есть ли у вас какие-либо советы о том, где моя проблема?

ответ

0

Я не думаю, что вам нужен блок if (! _isSeek). Похоже, вы нажимаете байты, когда получаете их в последовательном порядке, и поэтому никогда не искать. Похоже, что он вытолкнет первый набор байтов, а затем добавит действие поиска и добавит остальные байты. Попробуйте просто удалить этот блок и посмотреть, работает ли он.

В противном случае я думаю, что все в порядке.

0

в "ul.readBytes (bytes, bytes.length);" строка, есть ошибка, я думаю. Для меня это тоже не сработало. Он всегда возвращает полную длину (от 0 до доступных байтов). Так он имеет огромную утечку памяти. Но если вы используете flash player 11.4 или новее, вы можете изменить его так.

ul.position = bytes.length; 
ul.readBytes(bytes); 
+0

Относительно "..in' ul.readBytes (bytes, bytes.length); 'строка, есть ошибка, о которой я думаю. Это никогда не срабатывало и для меня ..". ** Нет ошибки **. Вы кормите неполные байты кадра и это замявает декодер. Каждый цикл progressEvent автоматически не останавливается/не запускается в байтах следующего кадра, поэтому, если вы получаете только кадры 8 и половину байтов байта в цикле 1, тогда цикл 2 включает в себя несколько полных байтов (из 8), которые не являются полными кадровыми данными, они будут застревать , Любой из них добавляет за x-число кадров количество байтов или ждет всех байтов, а затем добавляет, когда progressEvent завершает –

+0

В этой функции progressEvent используйте appendbytes только в этой строке 'if (bytes.length == e.bytesTotal) {trace (" END «); NetStream.appendBytes (байты); } 'Это будет добавляться, когда все байты доступны и, следовательно, не будут замораживаться. –

 Смежные вопросы

  • Нет связанных вопросов^_^