我试着用佳能相机模拟现场场景。
我使用CanonSDK与摄像头进行交互,每隔一段时间就会得到一幅图像,以便逐帧模拟视频。这很好,我使用java来做后端,并通过BlazeDS将图像发送到flex。
问题不是获取图像,而是当我使用像这样的东西加载一个新映像时,问题是:
image.source=my_new_image;
新图像被加载,但它产生一个短的白色眨眼,它破坏了视频.
因此,我想知道这是否是一种在flex上更新图像的方法,以避免闪烁问题,或者我是否可以从java中进行视频流并使用flex.来获取它
提前谢谢!
发布于 2011-10-27 15:27:42
简单的方法是使用名为double buffering的技术,使用两个Loaders -一个用于可见的图像,另一个用于正在加载和不可见的图像。当图像完成加载时,它变得可见,另一个变得不可见,进程重复。
就效率而言,最好至少使用到服务器的套接字连接来传输图像字节,最好是AMF格式,因为它的开销很小。在BlazeDS中,这在一些脚本中是相当可能的。
为了提高效率,您可以尝试在服务器上使用实时帧或视频编码器,但是在客户机上解码视频将是一项挑战。为了获得最好的性能,最好使用内置的视频解码器和流媒体服务器(如)。
更新(示例脚本):
此示例通过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();
}https://stackoverflow.com/questions/7918166
复制相似问题