Flex / Flash Builder / Actionscript / AIR / Mobile iOS如何使用相机拍摄视频和/或浏览&查看/访问存储在“相机胶卷”中的视频

时间:2013-01-08 17:49:15

标签: ios flex mobile video actionscript

我目前的理解是:

CameraUI的

  1. 我可以使用 CameraUI 访问 MediaType.VIDEO 的内置摄像头,并委托内置摄像头应用程序让我录制视频。我的应用程序现在就这样做了。

  2. 当我停止录制并点击“使用”按钮时,我将返回我的应用程序,理论上我有一个有效的 MediaPromise

  3. iOS确实没有为录制的视频(或照片)提供有效/可用的网址/文件名,因此我必须使用 Loader 来导入/使用/访问“已录制”视频... AND ... iOS实际上并未在设备上的任何位置创建文件,最重要的是,在相机胶卷中当使用系统本机相机/视频应用程序时,期望正常行为。

  4. 文档说 Loader 可以加载各种图像类型和SWF,但是没有关于视频数据的内容,所以我从中得出结论,我实际上无法使用 CameraUI 生成有效的 MediaPromise ,然后我可以将其传递给 Loader 类或类似内容,以读取系统相机创建的信息,然后进行操作(上传,保存到< strong> applicationStorageDirectory ,和/或在API中提供的两个视频播放器组件之一中显示。

  5. CameraRoll

    1. 我可以在 iOS相机胶卷中使用视频实体,但AS3 / Air3.5 CameraRoll 类不允许我以任何方式查看/访问/引用它们
    2. 普通文件I / O

      1. 我尝试使用Air3.5 文件类来浏览 iOS相机胶卷的存储位置已被拒绝。
      2. -------问题-------

        1. 我是否认为有办法拍摄视频,但无法使用已拍摄的视频。 (无法成功使用生成的MediaPromise。)

        2. 我相信您可以使用Android拍摄视频并进行访问,但文档中没有任何内容表明您无法使用iOS。

        3. 我是否相信iOS沙盒应用程序使他们无法使用标准文件I / O浏览到视频/照片存储,但只能通过我尝试过的显然不可行的方式(CameraUI&amp; CameraRoll) )

        4. 我认为这些应该是使用XCode Objective C ++等途径可以实现的相当明显的需求,但由于Apple阻止功能或因为Adobe未能满足而导致AIR Mobile Framework不允许合理的期望?

        5. 要传达的一个讽刺意味。如果我使用iOS系统相机应用程序录制视频,那么该视频的一部分会出现在图库/相机胶卷中,当然,我可以分享或查看它,或者其他......如果我使用AIR的CameraRoll。 browseForImage(),前提是我没有使用相机拍摄另一张图片,当它显示存储图片的文件夹时,文件夹图标使用添加的最后一个对象的缩略图...在这种情况下,视频我拿了,但是如果我输入文件夹,则无法找到视频。它在戏弄我们。它知道它在那里,但它显然是禁果。

1 个答案:

答案 0 :(得分:2)

我无法回答您的所有问题,因此此条目可能无法接受,但我在搜索解决方案时遇到了您描述的问题并认为其他人可能会发现此答案(部分)有用。 / p>

要保存您刚拍摄的电影,您需要打开并阅读承诺中的数据 iOS不会保​​存文件,因此MediaPromise.file始终为空。

这是我解决问题的方法:

private var camera:CameraUI;
private var dataInput:IDataInput;

public function recordVideo():void
{
    // Start the camera and ask for a video
    camera = new CameraUI();
    camera.addEventListener(MediaEvent.COMPLETE, onCameraComplete);
    camera.launch(MediaType.VIDEO);
}

private function onCameraComplete(event:MediaEvent):void
{   
    // event.data is a MediaPromise and MediaPromise.open() returns a IDataInput
    // Let's cast it to a dispatcher and check when it's complete
    dataInput = event.data.open();
    var dispatcher:IEventDispatcher = IEventDispatcher(dataInput);
    dispatcher.addEventListener(Event.COMPLETE, onDataInputComplete);
}

private function onDataInputComplete(event:Event):void 
{
    // We can do whatever we want with the data, so we'll store it in a File
    var file:File = new File();
    var bytes:ByteArray = new ByteArray();
    var stream:FileStream = new FileStream();

    // Reading the data from the opened MediaPromise
    dataInput.readBytes(bytes);

    stream.open(file, FileMode.WRITE);
    stream.writeBytes(bytes, 0, bytes.bytesAvailable);
    stream.close();
}

另外,我还在寻找一种方法将电影放入CameraRoll