[英]AS3 AIR For iOS - StageVideo not working correctly
我想讓StageVideo在我的應用程序中工作,但我遇到了問題。 我需要一個接一個地播放一系列視頻,第一個視頻總是播放正常,但其他視頻只播放音頻,StageVideo將顯示第一個視頻的最后一幀。
這就好像StageVideo已經凍結並正在播放視頻但我看不到它(只聽到它)。 我在這里發布了完整的代碼:
我正在使用Adobe Air 3.2 beta在iPad2上進行測試,但也測試了3.1和相同的結果。
這是我的視頻課程:
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{}
}
}
這是我在框架中使用的代碼:
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');
}
在與這個bug斗爭並完全重寫代碼后,我發現原因是因為我沒有清除附加到StageVideo的netStream引用,即; StageVideo.attachNetStream(null)
;
這需要在播放每個新視頻之前/之后清除。
在第二次調用attachNetStream()之前,調用當前連接的NetStream對象的close()方法。 調用close()會釋放播放視頻所涉及的所有資源,包括硬件解碼器。 然后,您可以使用另一個NetStream對象或null調用attachNetStream()。
你設置backgroundAlpha = 0? - > s:應用backgroundAlpha = 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.