Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在flex中不闪烁地更新照片_Java_Apache Flex_Image_Camera - Fatal编程技术网

Java 在flex中不闪烁地更新照片

Java 在flex中不闪烁地更新照片,java,apache-flex,image,camera,Java,Apache Flex,Image,Camera,我正试图用佳能相机模拟实时视图 我使用CanonSDK与cam交互,我每隔很短的时间就会得到一幅图像,以便逐帧模拟视频。这很好,我使用java做后端,并通过BlazeDS将图像发送到flex 问题在于无法获取图像,问题在于,当我使用类似的方法加载新图像时: image.source=我的新图片 新图像已加载,但会产生短暂的白色闪烁并破坏视频… 因此,我想知道这是否是一种在flex上更新图像的方法,以避免闪烁问题,或者我是否可以从java制作视频流并使用flex拾取它… 提前感谢 简单的方法是使用

我正试图用佳能相机模拟实时视图

我使用CanonSDK与cam交互,我每隔很短的时间就会得到一幅图像,以便逐帧模拟视频。这很好,我使用java做后端,并通过BlazeDS将图像发送到flex

问题在于无法获取图像问题在于,当我使用类似的方法加载新图像时:

image.source=我的新图片

新图像已加载,但会产生短暂的白色闪烁并破坏视频…

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


提前感谢

简单的方法是使用一种称为
双缓冲的技术,使用两个
加载程序
——一个用于可见的图像,另一个用于正在加载且不可见的图像。当图像完成加载后,它将变为可见,而另一个图像将变为不可见,并且该过程将重复

就效率而言,最好至少使用到服务器的套接字连接来传输图像字节,最好是采用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();
}

简单的方法是使用一种称为双缓冲的技术,使用两个
加载程序
——一个用于可见的图像,另一个用于正在加载且不可见的图像。当图像完成加载后,它将变为可见,而另一个图像将变为不可见,并且该过程将重复

就效率而言,最好至少使用到服务器的套接字连接来传输图像字节,最好是采用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();
}

如果我不得不猜测,在创建下一个图像之前,一个图像被破坏,导致白色光点。也许您可以尝试使用两个相互堆叠的图像。在背景中渲染下一个,然后将其置于前面。不过,这只是一个猜测。如果我不得不猜测一个图像在下一个图像创建之前被破坏,导致白色光点。也许您可以尝试使用两个相互堆叠的图像。在背景中渲染下一个,然后将其置于前面。不过,这只是一个猜测。这是一个很好的建议,尽管我怀疑BlazeDS会进一步压缩这些图像,因为它们已经是二进制格式。感谢所有询问并给出答案的人。。。现在我不在工作。。。但明天我会试试看,然后把发生的事情告诉你。。。谢谢@肖恩,是的,但我从来没有说过使用BlazeDS“更压缩”。我说“更高效”,不同的短语,不同的意思。与HTTP等替代方案相比,这种效率是由于开销较小。HTTP要求每个请求都有一个新的连接,并添加额外的头。传输的数据还需要采用某种容器格式,如PNG或JPEG。AMF套接字只需要一个连接,每次传输的开销很小,可以通过从图像数据中剥离标题来进一步优化。@lukevanin我正在尝试实现此解决方案。。。但我真的不知道我是否需要等待一个事件或某事,直到我设置可见的新图像。。。提前感谢@MatiasCaamaño是的,您需要在Loader.contentLoaderInfo上侦听
COMPLETE
事件。我添加了一个这样做的例子。这是一个很好的建议,尽管我怀疑BlazeDS会进一步压缩图像,因为它们已经是二进制格式。感谢所有询问并给出答案的人。。。现在我不在工作。。。但明天我会试试看,然后把发生的事情告诉你。。。谢谢@肖恩,是的,但我从来没有说过使用BlazeDS“更压缩”。我说“更高效”,不同的短语,不同的意思。与HTTP等替代方案相比,这种效率是由于开销较小。HTTP要求每个请求都有一个新的连接,并添加额外的头。传输的数据还需要采用某种容器格式,如PNG或JPEG。AMF套接字只需要一个连接,每次传输的开销很小,可以通过从图像数据中剥离标题来进一步优化。@lukevanin我正在尝试实现此解决方案。。。但我真的不知道我是否需要等待一个事件或某事,直到我设置可见的新图像。。。提前感谢@MatiasCaamaño是的,您需要在Loader.contentLoaderInfo上侦听
COMPLETE
事件。我添加了一个这样做的示例。