VideoTexture понижает до программного рендеринга в эфире

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

Я использую 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.")
        }
    }

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

РЕДАКТИРОВАТЬ: я сделал некоторый прогресс

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

1 ответ

Решение

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

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

Другие вопросы по тегам