Adobe air mobile Почему при запуске видео на сцене мигает сцена? - PullRequest
3 голосов
/ 02 февраля 2012

Я пытаюсь воспроизвести видео на планшете Android с помощью stageVideo, но каждый раз, когда я нажимаю кнопку воспроизведения и добавляю видео на сцену, приложение дырки мерцает, а затем видео добавляется на сцену.Затем видео начинается с пикселизации.Затем он уходит и начинает играть правильно с несколькими прыжками.Мне интересно, что это за случай?Есть ли лучший способ загрузить видео.Это также может произойти при использовании видеообъекта в flex.Видео хранится локально в файле: /// mnt / sdcardТип видео H.264Спасибо за вашу помощь!Если я пропустил что-то, что вам нужно знать, пожалуйста, прокомментируйте, и я отредактирую свой вопрос.

Вот вид для видео.(я использую мобильное приложение, основанное на просмотре)

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" title="stageVidPage" backKeyPressed="0" xmlns:mx="library://ns.adobe.com/flex/mx"  backgroundAlpha="0" alpha="1">

<fx:Script>
    <![CDATA[
        import ios.iOSStageVideo;
        import mx.core.UIComponent;
        import mx.events.FlexEvent;

        protected function backClick(event:MouseEvent):void
        {
            navigator.pushView(SliderAppHomeView);
        }


        protected function playVideo(event:MouseEvent):void
        {
            var path:String = new String(new File("file:///mnt/sdcard/Movies/Video_test_11.mp4").url); 
            var vid:iOSStageVideo = new iOSStageVideo( path , 1280 , 720 ); 
            vid.addEventListener('videoDone' , videoStop); 

            var container:UIComponent = new UIComponent(); 
            container.width = stage.stageWidth; 
            container.height = stage.stageHeight; 
            addElement( container ); 

            container.addChild( vid ); 
        }

        private function videoStop(e:Event):void {
                //vid.stopVideo(); 
                //container.removeChild( vid ); 
                //removeElement( container ); 
        }
    ]]>
</fx:Script>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:actionContent>
    <s:Button click="backClick(event)" label="Back"/>
</s:actionContent>

    <s:Button left="10" bottom="10" label="Play" alpha="1" click="playVideo(event)"/>
</s:View>

Вот класс As, который я нашел в Интернете, чтобы помочь воспроизвести видео (на самом деле не использую его много, и, поскольку оно дает некоторые ошибки, когда видеозаканчивается, мне нужно будет переписать его. Я закомментировал эти части)

package ios 
{ 
import flash.display.Sprite; 
import flash.display.StageAlign; 
import flash.display.StageQuality; 
import flash.display.StageScaleMode; 
import flash.events.Event; 
import flash.events.NetStatusEvent; 
import flash.events.StageVideoAvailabilityEvent; 
import flash.events.StageVideoEvent; 
import flash.geom.Rectangle; 
import flash.media.StageVideo; 
import flash.media.StageVideoAvailability; 
import flash.media.Video; 
import flash.net.NetConnection; 
import flash.net.NetStream; 


[Bindable] 
public class iOSStageVideo extends Sprite 
{ 
    private var videoPath:String; 
    private var videoWidth:Number; 
    private var videoHeight:Number; 
    private var _sv:StageVideo; 
    private var _vd:Video; 
    private var _obj:Object; 
    private var _ns:NetStream; 

    public function iOSStageVideo( path:String , w:Number , h:Number ){ 
        videoPath = path; 
        videoWidth = w; 
        videoHeight = h; 
        addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 
    } 

    //stage is ready 
    private function onAddedToStage(e:Event):void{ 
        stage.scaleMode = StageScaleMode.NO_SCALE; 
        stage.align = StageAlign.TOP_LEFT; 

        var nc:NetConnection = new NetConnection(); 
        nc.connect(null); 

        _ns =  new NetStream(nc); 
        _obj = new Object(); 

        _ns.client = _obj; _ns.bufferTime = 2; 
        _ns.client = _obj; 

        _obj.onMetaData = MetaData; 

        _sv = stage.stageVideos[0]; 
        _sv.viewPort = new Rectangle(0, 0, videoWidth , videoHeight ); 
        _sv.attachNetStream(_ns); 

        playVideo(); 
    } 


    //video is ready, play it 
    //public, can be called externally 
    public function playVideo():void{ 
        _ns.play( videoPath ); 
        _ns.addEventListener(NetStatusEvent.NET_STATUS, videoStatus); 
    } 

    //required metadata for stagevideo, even if not used 
    private function MetaData(info:Object):void{ } 

    //get video status 
    private function videoStatus(e:NetStatusEvent):void{ 

        switch(e.info.code){ 
            case "NetStream.Play.StreamNotFound": 
                //do something 
                break; 
            case "NetStream.Play.Start": 
                //do something 
                break 
            case "NetStream.Play.Stop": 
                stopVideo(); 
                break; 
            case "NetStream.Buffer.Empty": 
                //do something 
                break; 
            case "NetStream.Buffer.Full": 
                //do something 
                break; 
            case "NetStream.Buffer.Flush": 
                //do something 
                break; 
        } 
    } 

    //stop and clear the video 
    //public, can be called externally 
    public function stopVideo():void{ 
        _ns.close(); 
        _ns.dispose(); 
        dispatchEvent( new Event('videoDone', true ) ); 
    } 
} 
}

Видео находится на планшете в локальной файловой системе.Спасибо за любую помощь!

...