2016-03-05 13 views
1

Я запускаю VideoTexture в Away3D, который обычно работает нормально. Я пытаюсь уменьшить черный разрыв между видео и пытаюсь заставить их выстраиваться в линию, но мои попытки привели к тому, что видео иногда понижалось до рендеринга программного обеспечения на мобильных устройствах, особенно когда оно начинается.VideoTexture downgrades to software Rendering in Air

Я использую Away3D с Starling и общим stage3DProxy.

Вот как я устанавливаю видео до

  sphereGeometry = new SphereGeometry(5000, 64, 48); 
      panoTexture2DBase = new NativeVideoTexture(Model.config.getAssetUrl(Model.currentScene.video), true, true); 

      panoTexture2DBase.addEventListener(NativeVideoTexture.VIDEO_START,function(e:Event =null){setTimeout(onVideoStart,1000)}); 
      panoTextureMaterial = new TextureMaterial(panoTexture2DBase, false, false, false); 

      panoVideoMesh = new Mesh(sphereGeometry, panoTextureMaterial); 
      panoVideoMesh.scaleX *= -1; 

      panoVideoMesh.rotate(Vector3D.Y_AXIS,-90); 

      scene.addChild(panoVideoMesh); 
      view.render(); 

      panoTexture2DBase.player.pause(); 

Я использую Away3D NativeVideoTexture загрузить NetStream. Последующие видео в целом прекрасны, а аппаратное ускорение. это просто первый, который всегда понижается.

Мой NativeVideoTexture класс

override protected function createTexture(context:Context3D):TextureBase 
    { 
     try 
     { 
      trace("Context3D.supportsVideoTexture", Context3D.supportsVideoTexture) 

      if (!Context3D.supportsVideoTexture) 
      { 
       throw new Error("flash.display3D.textures.VideoTexture not supported"); 
       return null; 
      } 

      texture = context.createVideoTexture(); 
      texture.attachNetStream(_player.ns); 

      _player.ns.addEventListener(NetStatusEvent.NET_STATUS, netstat); 
      _player.ns.seek(1); 
      texture.addEventListener(Event.TEXTURE_READY, onTextureReady); 
      texture.addEventListener(VideoTextureEvent.RENDER_STATE, onRenderState); 

      if (_autoPlay) _player.play(); 

     } 
     catch (e:Error) 
     { 
      trace(e, e.getStackTrace()); 
     } 

     return texture; 
    } 

    private function onMetaData(metaData:Object):void 
    { 
     duration = metaData.duration; 

    } 

    private function onTextureReady(e:Event):void 
    { 
    // trace("NativeVideoTexture.onTextureReady()"); 
     if(_player.duration) 
      if(_player.ns.time > _player.duration - 1){ 
       _player.pause(); 
       dispatchEvent(new Event(VIDEO_STOP)); 
       _player.seek(0); 
      } 
      else if(_player.ns.time > 0.01 && waitingForBuffer){ 
       dispatchEvent(new Event(VIDEO_START)); 
       waitingForBuffer = false; 
      } 

    } 




    private function onRenderState(e:VideoTextureEvent):void 
    { 
     trace(e.status); 
     if (e.status == VideoStatus.SOFTWARE) 
     { 
      trace("Indicates software video decoding works.") 
     } 
     if (e.status == VideoStatus.ACCELERATED) 
     { 
      trace("Indicates hardware-accelerated (GPU) video decoding works.") 
     } 
     if (e.status == VideoStatus.UNAVAILABLE) 
     { 
      trace("Indicates Video decoder is not available.") 
     } 
    } 

Может кто-нибудь помочь мне понять, почему первое видео всегда программное обеспечение делает?

EDIT: Я сделал некоторый прогресс

Иногда он начинается в режиме GPU, иногда в программном обеспечении. Есть ли что-нибудь, что может вызвать это?

ответ

0

Хакки, но он работает.

Если вы собираетесь выполнять рендеринг программного обеспечения, остановите и перезапустите видео до тех пор, пока оно не появится на графическом процессоре. Кажется, что это нужно несколько раз.