简体   繁体   English

适用于iOS的AS3 AIR - StageVideo无法正常工作

[英]AS3 AIR For iOS - StageVideo not working correctly

I'm trying to get StageVideo to work in my app but I'm having problems. 我想让StageVideo在我的应用程序中工作,但我遇到了问题。 I need to play a series of videos one after the other, the first video always plays fine but the others will only play the audio, and the StageVideo will show the last frame from the first video. 我需要一个接一个地播放一系列视频,第一个视频总是播放正常,但其他视频只播放音频,StageVideo将显示第一个视频的最后一帧。

It's as if the StageVideo has frozen and is playing the video but I can't see it (only hear it). 这就好像StageVideo已经冻结并正在播放视频但我看不到它(只听到它)。 I've posted my complete code here: 我在这里发布了完整的代码:

I'm testing on iPad2 with Adobe Air 3.2 beta, but have also tested with 3.1 and same results. 我正在使用Adobe Air 3.2 beta在iPad2上进行测试,但也测试了3.1和相同的结果。

Here is my video class: 这是我的视频课程:

package  {

    import flash.display.MovieClip;
    import flash.text.TextField;
    import flash.text.TextFormat;
    import flash.events.Event;
    import flash.media.StageVideo;
    import flash.events.StageVideoEvent;
    import flash.events.StageVideoAvailabilityEvent;
    import flash.media.StageVideoAvailability;
    import flash.net.NetStream;
    import flash.net.NetConnection;
    import flash.geom.Rectangle;
    import flash.events.NetStatusEvent;

    public class SVideo2 extends MovieClip {

        public static const VIDEO_FINISHED:String = 'videoFinished';

        private var debugPanel:TextField;
        private var addedToStage:Boolean = false;

        private var videoFile:String;

        private var hwaEnabled:Boolean = false;

        private var video:StageVideo;
        private var ns:NetStream;
        private var nc:NetConnection;

        public function SVideo2() {
            addDebugPanel();

            addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
        }

        private function onAddedToStage(e:Event) :void{
            output('ADDED TO STAGE');
            addedToStage = true;
            stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY, onAvail);
            removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
        }

        public function playVideo(videoFile:String) :void{
            output('playVideo: '+videoFile);
            if(addedToStage){
                this.videoFile = videoFile;
                if(hwaEnabled){
                    startPlaying();
                }
                else{
                    output('HWA NOT AVAILABLE');
                }
            }
            else{
                output('NOT ON STAGE');
            }
        }

        private function onAvail(e:StageVideoAvailabilityEvent) :void{
            output(e.availability);
            if(e.availability == StageVideoAvailability.AVAILABLE){
                output('VIDEO AVAILABLE');
                hwaEnabled = true;
            }
        }

        private function startPlaying() :void{
            output('STARTING TO PLAY');
            video = stage.stageVideos[0];
            video.addEventListener(StageVideoEvent.RENDER_STATE, onRender);

            nc = new NetConnection();
            nc.connect(null);
            ns = new NetStream(nc);

            ns.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);

            ns.client = this;

            video.attachNetStream(ns);
            ns.play(videoFile);
        }

        private function onRender(e:StageVideoEvent) :void{
            output('onRender');
            video.viewPort = new Rectangle(192, 50, 640, 480);
        }

        private function onNetStatus(e:NetStatusEvent) :void{
            output(e.info.code);
            if(e.info.code == 'Netstream.Play.Stop'){
                output('VIDEO STOPPED');
                dispatchEvent(new Event(VIDEO_FINISHED));
            }
        }

        private function addDebugPanel() :void{
            var tFormat:TextFormat = new TextFormat('Arial', 14, 0x000000, true);
            var tField:TextField = new TextField();

            tField.setTextFormat(tFormat);
            tField.multiline = true;
            tField.border = true;
            tField.borderColor = 0x000000;
            tField.background = true;
            tField.backgroundColor = 0xFFFFFF;

            tField.x = 0;
            tField.y = 568;
            tField.width = 1024;
            tField.height = 200;

            this.debugPanel = tField;
            addChild(debugPanel);
        }

        private function output(what:String) :void{
            debugPanel.appendText("\n"+what);
        }

        public function onXMPData(info:Object) :void{}
        public function onMetaData(info:Object) :void{}
        public function onCuePoint(info:Object) :void{}
        public function onPlayStatus(info:Object) :void{}

    }

}

And here's the code I'm using in frame: 这是我在框架中使用的代码:

import flash.display.Sprite;
import flash.events.MouseEvent;

var vid:SVideo2 = new SVideo2();
addChild(vid);

var btn:Sprite = new Sprite();
btn.graphics.beginFill(0x333333);
btn.graphics.drawRect(0, 0, 100, 40);
btn.x = 462;
btn.y = 518;
btn.width = 100;
btn.height = 40;

addChild(btn);

btn.addEventListener(MouseEvent.CLICK, onClick);

function onClick(e:MouseEvent) :void{
    var rand:String = String(Math.floor(Math.random() * 37));
    vid.playVideo('mp4/result_'+rand+'.mp4');
}

After fighting with this bug, and completely re-writing the code, I found that the reason was because I did not clear the netStream reference attached to the StageVideo, ie; 在与这个bug斗争并完全重写代码后,我发现原因是因为我没有清除附加到StageVideo的netStream引用,即; StageVideo.attachNetStream(null) ; StageVideo.attachNetStream(null) ;

This needs to be cleared before/after each new video is played. 这需要在播放每个新视频之前/之后清除。

Before calling attachNetStream() a second time, call the currently attached NetStream object's close() method. 在第二次调用attachNetStream()之前,调用当前连接的NetStream对象的close()方法。 Calling close() releases all the resources, including hardware decoders, involved with playing the video. 调用close()会释放播放视频所涉及的所有资源,包括硬件解码器。 Then you can call attachNetStream() with either another NetStream object or null. 然后,您可以使用另一个NetStream对象或null调用attachNetStream()。

have you set backgroundAlpha = 0 ? 你设置backgroundAlpha = 0? -> s:Application backgroundAlpha=0 - > s:应用backgroundAlpha = 0

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM