我正在构建一个使用视频转换从一个部分到另一个部分的 Flash 站点。每个部分的背景都是比过渡视频本身分辨率更高的静止帧照片,在过渡期间会按比例放大。每个视频过渡的第一帧是当前背景图像,每个视频过渡的最后一帧是目标的背景图像。粗略地说,这是网站上预期的导航流程:
静止状态:
前景中的高分辨率图像,无视频元素
用户点击导航项:
Flash 通过 netstream 对象准备一个 FLV 并对其进行缓冲,这是通过 netstream.play() 函数完成的。收到“Netstatus.Buffer.Full”事件后,netstream 对象将暂停并附加到视频对象,然后将其添加到前景中高分辨率图像后面的显示列表中。将视频对象添加到舞台后,前景中的高分辨率图像会 alpha 输出(通过补间),只留下背景视频。当前景完成补间后,将播放背景中的视频。一旦收到“NetStream.Play.Stop”,该过程就会反过来;也就是说,一个新的高分辨率前景图像在视频层上补间,一旦完成,视频就会从舞台上移除。
我认为我上面概述的流程没有任何问题(至少在原则上),而且听起来也不应该那么棘手。但是,在 FLV/视频对象的初始设置方面,我遇到了很多问题。起初,FLV 似乎没有正确排队,我的意思是,高分辨率前景图像过渡到白色屏幕,视频弹出并在一两秒后才开始播放。(FLV的第一帧肯定不是白色的)。
我不知道是什么可能导致了这种行为,但是在收到“Buffer.Full”后,我粗鲁地投入了一个计时器,该计时器在大约 100 毫秒内播放网络流,从而将视频推进到可能导致白屏的任何原因。这在本地运行良好,但是一旦我将站点放在开发主机上,它就会在转换期间返回白屏。恼人的是,将 hackish 延迟提高到 2 秒左右可以解决远程服务器上的白屏问题,但结果无法预测;根据连接速度,您可能会看到一切正常,或者您可能会陷入已经播放一两秒的视频。
我也尝试过使用 bytesLoaded/bytesTotal 而不是 netStatus 事件的类似方法,但无济于事。我的最后一个实验是使用提示点;在 FLV 编码期间,我在 FLV 中输入了 0.2 秒的提示点,并在对前景进行补间之前等待该提示点;再一次,它在本地工作,但在远程服务器上进行测试时,在视频开始播放之前,我被处理成了补间到白色。
我真的没有想法了,非常感谢你们提供的任何建议。非常感谢您的时间和考虑!
贾斯汀