为什么在iPad2/iOS6上从摄像头到广播的时间延迟很长(47秒)-摄像头、加载器、MediaEvent、MediaPromise
我在使用Jason Sturges提供的DevGirl XpenseIt解决方案时获得了巨大的成功,该解决方案是为了响应其他两个请求:(http://stackoverflow.com/questions/11812807/take-photo-using-adobe-builder-flex-for-ios (最好的例子) 非常成功,除了在使用CameraUI和教程中的util类拍照后按下iOS6中的“使用”按钮,在“fileReady”事件发生之前,总共需要47只1河马和2只河马 在我看来,装入器类似乎不会花费那么长的时间 我可以做些什么来提高这个性能吗?我不得不添加一个匆匆忙忙等待的UI元素,这样我的用户就不会认为程序挂起了。这是我目前正在使用的CameraUtil.as的代码为什么在iPad2/iOS6上从摄像头到广播的时间延迟很长(47秒)-摄像头、加载器、MediaEvent、MediaPromise,ios,apache-flex,mobile,air,loader,Ios,Apache Flex,Mobile,Air,Loader,我在使用Jason Sturges提供的DevGirl XpenseIt解决方案时获得了巨大的成功,该解决方案是为了响应其他两个请求:(http://stackoverflow.com/questions/11812807/take-photo-using-adobe-builder-flex-for-ios (最好的例子) 非常成功,除了在使用CameraUI和教程中的util类拍照后按下iOS6中的“使用”按钮,在“fileReady”事件发生之前,总共需要47只1河马和2只河马 在我看来,
// http://stackoverflow.com/questions/11812807/take-photo-using-adobe-builder-flex-for-ios
package classes
{
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IEventDispatcher;
import flash.events.MediaEvent;
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;
import flash.media.CameraRoll;
import flash.media.CameraUI;
import flash.media.MediaPromise;
import flash.media.MediaType;
import flash.utils.ByteArray;
import mx.graphics.codec.JPEGEncoder;
import events.CameraEvent;
[Event(name = "fileReady", type = "events.CameraEvent")]
public class CameraUtil extends EventDispatcher
{
protected var camera:CameraUI;
protected var loader:Loader;
public var file:File;
public function CameraUtil(target:IEventDispatcher=null)
{
super(target);
if (CameraUI.isSupported)
{
camera = new CameraUI();
camera.addEventListener(MediaEvent.COMPLETE, mediaEventComplete);
}
} // End CONSTRUCTOR CameraUtil
public function takePicture():void
{
if (camera)
camera.launch(MediaType.IMAGE);
} // End FUNCTION takePicture
protected function mediaEventComplete(event:MediaEvent):void
{
var mediaPromise:MediaPromise = event.data;
if (mediaPromise.file == null)
{
// For iOS we need to load with a Loader first
loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderCompleted);
loader.loadFilePromise(mediaPromise);
return;
}
else
{
// Android we can just dispatch the event that it's complete
file = new File(mediaPromise.file.url);
dispatchEvent(new CameraEvent(CameraEvent.FILE_READY, file));
}
} // End FUNCTION mediaEventComplete
protected function loaderCompleted(event:Event):void
{
var loaderInfo:LoaderInfo = event.target as LoaderInfo;
if (CameraRoll.supportsAddBitmapData)
{
var bitmapData:BitmapData = new BitmapData(loaderInfo.width, loaderInfo.height);
bitmapData.draw(loaderInfo.loader);
file = File.applicationStorageDirectory.resolvePath("receipt" + new Date().time + ".jpg");
var stream:FileStream = new FileStream()
stream.open(file, FileMode.WRITE);
var j:JPEGEncoder = new JPEGEncoder();
var bytes:ByteArray = j.encode(bitmapData);
stream.writeBytes(bytes, 0, bytes.bytesAvailable);
stream.close();
dispatchEvent(new CameraEvent(CameraEvent.FILE_READY, file));
}
} // End FUNCTION loaderComplete
} // End CLASS CameraUtil
} // End PACKAGE classes
通过从流程中删除一个步骤,我能够解决延迟问题。这一步我自己不需要(目前),但其他人可能需要,因此,取消这一步并不能真正回答“为什么这一看似合理的过程花费了看似不合理的时间”的问题 我需要的是位图数据,而不是一个外部文件,因此: 摄像头=>[snap]=>媒体承诺=>加载程序=>写入文件=>事件=>读取文件=>使用位图数据 我重写了类以剪切文件/AppStorage I/o 摄像头=>[snap]=>媒体承诺=>加载程序=>使用位图数据 所以这是一个非常合理的(和预期的comp时间) 然而,我仍然感到惊讶的是,使用CameraUtil类中使用的方法将数据写入文件需要如此长的时间。我确实需要将这些图像写入文件,但直到用户将其大小减小到1024x768裁剪区域,并且我将其编码为一个非常压缩的jpg,所以希望我只能在挂起/压缩时间的较小部分上挣扎
有人知道。。。从AdobeAIR(通过flex)向iOS中的应用程序存储写入1个文件是否需要很长时间?我发现这个过程也非常缓慢。。。 然而,JPEG编码器似乎是造成这种延迟的主要原因。 使用优化的编码器,您可以大大加快处理速度 根据您的设备,它的速度大约是原来的2到4倍 另一个可以省略的步骤是bitmapData.draw(),直接使用Loader.content也很慢。这样,您可以跳过另一个位图实例的实例化,这将增加内存使用 像这样:
protected function loaderCompleted(event:Event):void
{
var loader:Loader = (event.target as LoaderInfo).loader;
var bitmap:Bitmap = loader.content as Bitmap;
(...)
}
不过,我还在等待有人写一个iOS.ane,它应该能够在几毫秒而不是几秒钟内编码一个jpg。但与此同时……;)