【发布时间】:2017-08-16 09:25:45
【问题描述】:
我正在编写一个简单的程序,当我按下两个不同的键时,它会从一个视频切换到另一个。如果我按 F 键将显示视频 1,如果按 2 键将显示视频 2。如果按 F 或 2 键将显示视频 1 或视频 2,我在两个视频之间切换。我有个问题。如果我快速按下 2 和 F fps 开始下降,快速按下 2 和 F 后 .swf 崩溃。我认为这是我的代码的问题,因为它没有优化。基本思想是,每当用户在显示视频时按 F 或 2 键时,我都会关闭该视频的流并开始流式传输另一个视频,依此类推。这是代码:
package {
import flash.display.MovieClip;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.events.AsyncErrorEvent;
import flash.media.Video;
import flash.events.MouseEvent;
import flash.ui.Keyboard;
import flash.events.KeyboardEvent;
import flash.events.Event;
import flash.utils.getTimer;
public class MainDisplayDifferentVideoOnCLick extends MovieClip {
public function MainDisplayDifferentVideoOnCLick() {
keyPressed();
fpsNumber();
}
public function keyPressed(): void {
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
function onKeyDown(myKey: KeyboardEvent): void {
if (myKey.keyCode == 70) {
playVideo1();
}
if (myKey.keyCode == 50) {
playVideo2();
}
}
}
function playVideo1(): void {
var networkConnection: NetConnection = new NetConnection();
networkConnection.connect(null);
var networkStream: NetStream = new NetStream(networkConnection);
networkStream.addEventListener(AsyncErrorEvent.ASYNC_ERROR, errorHandler);
networkStream.play("Damiani.mp4");
function errorHandler(error1: AsyncErrorEvent): void {
// ingoro l' evento
}
var myVideo1: Video = new Video();
myVideo1.attachNetStream(networkStream);
myVideo1.width = 1920;
myVideo1.height = 1080;
addChild(myVideo1);
stage.addEventListener(KeyboardEvent.KEY_DOWN, on2Down);
function on2Down(ev: KeyboardEvent): void {
if (ev.keyCode == 50) {
networkStream.close();
}
}
}
function playVideo2(): void {
var networkConnection: NetConnection = new NetConnection();
networkConnection.connect(null);
var networkStream: NetStream = new NetStream(networkConnection);
networkStream.addEventListener(AsyncErrorEvent.ASYNC_ERROR, errorHandler);
networkStream.play("Sfelab.mp4");
function errorHandler(error1: AsyncErrorEvent): void {
// ingoro l' evento
}
var myVideo2: Video = new Video();
myVideo2.attachNetStream(networkStream);
myVideo2.width = 1920;
myVideo2.height = 1080;
addChild(myVideo2);
stage.addEventListener(KeyboardEvent.KEY_DOWN, onFDown);
function onFDown(ev: KeyboardEvent): void {
if (ev.keyCode == 70) {
networkStream.close();
}
}
}
public function fpsNumber(): void {
var frames: int = 0;
var prevTimer: Number = 0;
var curTimer: Number = 0;
this.addEventListener(Event.ENTER_FRAME, performFrameTest);
function performFrameTest(e: Event): void {
frames += 1;
curTimer = getTimer();
if (curTimer - prevTimer >= 1000) {
trace("FPS: ");
trace(Math.round(frames * 1000 / (curTimer - prevTimer)));
prevTimer = curTimer;
frames = 0;
}
}
}
}
}
你有什么建议吗?谢谢!
【问题讨论】:
-
不要在函数内部声明函数。然后,改变逻辑。使唯一的方法 playVideo 接受视频 url。如果 url 是当前正在播放的 url,什么也不做。如果 url 不同,请关闭当前视频并开始新视频。然后制作 KEY_DOWN 监听器,它只使用相关的 url 调用上面的方法。您可能还想在按键和实际更改视频之间设置一定的超时时间,例如 100 毫秒。用户不会注意到,但这对程序来说是一种解脱。
-
您需要同时加载两个视频,然后通过隐藏其中一个来切换(使用
.visible=false;)并使用soundTransform关闭不可见的声音i> 视频。此外,每次按下按键时,您都不需要在 RAM 中创建new任何东西。只需为视频播放一次创建一个设置,然后重复使用(例如:您的playVideoX函数应该只是.play("fileName"),而不是添加更多new netStream's 和new netConnection' s(如果创建太多,您的应用会崩溃)
标签: actionscript-3 flash video video-processing frame-rate