在flex中更新照片而不闪烁

时间:2011-10-27 15:16:23

标签: java flex image camera

我正在尝试使用佳能相机模拟实时视图。

我正在使用CanonSDK与凸轮进行交互,我每隔一段时间就会得到一张图像,以便逐帧模拟视频。这很好用,我使用java来做后端并通过BlazeDS将图像发送到flex。

问题不在于获取图片问题在于,当我使用类似的内容加载新图片时:

  

image.source = my_new_image;

新图片已加载,但会产生短暂的白色闪烁并导致视频丢失......

所以我想知道这是否是一种在flex上更新图像以避免闪烁问题的方法,或者我是否可以从java制作视频流并使用flex来获取...

提前致谢!!!

1 个答案:

答案 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();
}