我正在构建一个大型 Flash 网站 (AS3),它使用巨大的 FLV 作为部分之间的过渡视频。 FLV 为 1280x800,正在缩放至 1680x1050(其中大部分不会向屏幕较小的用户显示),每个大约 5-8 秒。我正在使用 On2 的高清编解码器 VP6-S 对视频进行编码,使用原生 FLV 播放器、配备 Perian 的 Quicktime 以及内置于 AS3 中的简单概念验证 FLV 播放应用程序播放效果非常好。
我遇到的问题是在实际站点的上下文中,播放不那么流畅;帧率不如应有的好,而且更成问题的是,偶尔会出现抖动和丢帧(有时视频会暂停四分之一秒左右)。我的猜测是,这是由 Flash 播放器中的垃圾收集引起的,它的发生是不确定的,因此很难测试和控制。
我正在使用 FLVPlayback 的单个实例来播放视频;我最初直接使用 NetStream 对象等,但为了 this reason 切换到 FLVPlayback| .有没有人在使用 FLVPlayback(或更一般地说,使用高清 Flash 视频)时遇到过这种抖动?我关于 GC 是罪魁祸首的说法是否正确?如果是这样,在播放这些系统密集型过渡期间有什么方法可以阻止它吗?
最佳答案
FLV/F4V 播放中的抖动几乎不是垃圾收集的结果 - 视频实际上一直保存在内存中直到它完全卸载,所以根本没有发生垃圾收集(除非你做了一些非正统的事情 比如将视频放在 cacheAsBitmap 设置为 true 的容器上)。
如果您不需要特定的 FLV 功能(如 the link posted by daidai suggests - 免责声明,这是我的博客),则切换到 F4V 会有所帮助,但总的来说,您还必须了解任何影响屏幕上视频合成的因素。由于大尺寸视频会强制重新渲染与其重叠的所有内容,因此任何小对象都会对性能产生重大影响。
视频上方有东西吗?如果可能,尝试摆脱它们,或将 cacheAsBitmap 设置为 true(如果它们不是动画)。这特别适用于复杂的矢量绘图或文本(绘制位图/图像要快得多)。如果他们有不同的混合模式,你有点搞砸了——你能改用正常的混合模式吗?
视频下面有什么吗?如果是这样,请在播放视频时摆脱它们(只需将可见性设置为 false)。
要检查不必要的渲染,以某种方式暂停视频,右键单击,打开“显示重绘区域”(调试播放器)。你看到红色方 block 连续绘制了吗?然后在后台发生了一些事情,最好摆脱它。
您是否通过 onEnterFrame 或计时器/间隔在后台发生任何事情?尝试暂停它。
您的视频是 30fps 和 CG 渲染(例如,可以使用运动模糊)吗?如果是,请尝试以 24fps 或介于两者之间的速度渲染 - 质量仍然不错,但要解码和绘制的数据要少得多。
您可以使用较小的视频吗?即使您仍然以相同的更大尺寸渲染它们,解码和渲染的像素数据更少也会有很大帮助,而且对质量的影响可能非常小。
这几乎就是所有的总结。不过,摆脱屏幕上的所有其他内容通常是您的第一要务。
关于actionscript-3 - FLV 性能和垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2678594/