我正在尝试使用佳能相机模拟实时视图。
我正在使用CanonSDK与凸轮进行交互,我每隔一段时间就会得到一张图像,以便逐帧模拟视频。这很好用,我使用java来做后端并通过BlazeDS将图像发送到flex。
问题不在于获取图片,问题在于,当我使用类似的内容加载新图片时:
image.source = my_new_image;
新图片已加载,但会产生短暂的白色闪烁并导致视频丢失......
所以我想知道这是否是一种在flex上更新图像以避免闪烁问题的方法,或者我是否可以从java制作视频流并使用flex来获取...
提前致谢!!!
答案 0 :(得分:3)
简单的方法是使用名为double buffering
的技术,使用两个Loaders
- 一个用于可见的图像,一个用于正在加载且不可见的图像。当图像完成加载后,它变得可见,而另一个变得不可见,并且该过程重复进行。
就效率而言,最好至少使用到服务器的套接字连接来传输图像字节,最好是AMF格式,因为它的开销很小。这在BlazeDS中完全可以使用一些脚本。
为了提高效率,您可以尝试在服务器上使用实时帧或视频编码器,但在客户端解码视频将具有挑战性。为获得最佳性能,最好使用内置视频解码器和流媒体服务器,如Flash Media Server。
更新(示例脚本):
此示例通过HTTP加载图像。更有效的方法是使用AMF套接字(如上所述)传输图像,然后使用Loader.loadBytes()来显示它。
private var loaderA:Loader;
private var loaderB:Loader;
private var foregroundLoader:Loader;
private var backgroundLoader:Loader;
public function Main()
{
loaderA = new Loader();
loaderB = new Loader();
foregroundLoader = loaderA;
backgroundLoader = loaderB;
loadNext();
}
private function loadNext():void
{
trace("loading");
backgroundLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderCompleteHandler);
backgroundLoader.load(new URLRequest("http://www.phpjunkyard.com/randim/randim.php?type=1"));
}
private function loaderCompleteHandler(event:Event):void
{
trace("loaded");
var loaderInfo:LoaderInfo = event.target as LoaderInfo;
var loader:Loader = loaderInfo.loader;
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, loaderCompleteHandler);
if (contains(foregroundLoader))
removeChild(foregroundLoader);
var temp:Loader = foregroundLoader;
foregroundLoader = backgroundLoader;
backgroundLoader = temp;
addChild(foregroundLoader);
loadNext();
}