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
为什么在iPad2/iOS6上从摄像头到广播的时间延迟很长(47秒)-摄像头、加载器、MediaEvent、MediaPromise_Ios_Apache Flex_Mobile_Air_Loader - Fatal编程技术网

为什么在iPad2/iOS6上从摄像头到广播的时间延迟很长(47秒)-摄像头、加载器、MediaEvent、MediaPromise

为什么在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只河马 在我看来,

我在使用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的代码

// 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。但与此同时……;)