热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AS3空气为iOS-StageVideo不能正常工作-AS3AIRForiOS-StageVideonotworkingcorrectly

ImtryingtogetStageVideotoworkinmyappbutImhavingproblems.Ineedtoplayaseriesofv

I'm trying to get StageVideo to work in my app but I'm having problems. 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在我的应用中运行,但我遇到了问题。我需要一个接一个地播放一系列视频,第一个视频总是播放得很好,但是其他的只播放音频,而StageVideo会播放第一个视频的最后一帧。

It's as if the StageVideo has frozen and is playing the video but I can't see it (only hear it). I've posted my complete code here:

这就像《斯塔维迪欧》(StageVideo)已经停播,正在播放视频,但我看不见(只能听到)。我在这里发布了完整的代码:

I'm testing on iPad2 with Adobe Air 3.2 beta, but have also tested with 3.1 and same results.

我正在用adobeair 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:

这是我在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');
}

2 个解决方案

#1


4  

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, i.e; StageVideo.attachNetStream(null);

在与这个bug战斗之后,我完全重写了代码,我发现原因是我没有清除与StageVideo相关的netStream引用,即;StageVideo.attachNetStream(空);

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. Calling close() releases all the resources, including hardware decoders, involved with playing the video. Then you can call attachNetStream() with either another NetStream object or null.

在第二次调用attachNetStream()之前,请调用当前附加的NetStream对象的close()方法。调用close()将释放与播放视频相关的所有资源,包括硬件解码器。然后,可以使用另一个NetStream对象或null调用attachNetStream()。

  • http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/StageVideo.html#attachNetStream%28%29
  • http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/StageVideo.html attachNetStream % 29 28%

#2


0  

have you set backgroundAlpha = 0 ? -> s:Application backgroundAlpha=0

你把背景设为0了吗?应用程序- > s:backgroundAlpha = 0


推荐阅读
author-avatar
海滨2502940147
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有