我在手机上拍摄了 3 个视频,默认存储在手机图库(Gallery/videos/)中。我必须在我的一个 flex 移动应用程序中播放这 3 个视频。如何将视频获取到 flex 项目?如果我需要浏览移动目录,请帮助我提供一些代码。
2 回答
从那以后,我发现使用委派系统相机拍摄的视频存储在 iOS -DOES!- 允许访问的临时存储位置。(我很惊喜。)
捕获的视频不会像使用 iOS 系统相机应用程序捕获的其他视频一样添加到设备的相机胶卷中,因此仅捕获视频并期望稍后能够访问它是不够的(例如,如果 CameraRoll.browseForVideo() 是曾经添加到 API 中。
因此,您必须“在获取良好时获取”并将文件从临时存储位置移动到某个非易失性位置,例如 ApplicationStorageDirectory 或用户的 Documents 目录(我认为 iOS 中的唯一选项)。
MediaPromise...我认为...对于通过任何直接渐进式加载器/流媒体方法访问视频完全没用,但仍提供临时文件的位置/url/路径/文件名,以便您可以对其执行文件操作。
具有讽刺意味的是,在使用 CameraRoll.browseForImage()... 时,有一些教程可以解决 MediaPromise 中缺少文件位置/url/路径/文件名的问题......并且该方法是使用加载器类来加载图像内容(你然后可以写入文件),但是在拍摄视频时,无法访问视频内容,而是提供了文件位置/url/路径/文件名。具有讽刺意味的是,我几乎找不到任何资源来帮助解决这个问题。叽
我将包含一些代码块,而无需真正编辑它们以去除无关的部分,因为它已经过去了我需要睡觉的时候,但我希望你拥有这个。我以后可能会来清理它。
本节位于 Spark SkinnablePopUpContainer 中,我对多个按钮使用相同的单击事件,因此下面的“案例”位于该事件处理函数中的开关案例中。
如果你不熟悉,'close(true, data)' 是关闭 SkinnablePopUpContainer 的方法,告诉父/所有者容器是故意关闭的,它应该寻找被共享回来的数据对象(即,有更改要“提交”)。
case "cameraVideo":
{
if(CameraUI.isSupported)
{
camera = new CameraUI();
camera.addEventListener(MediaEvent.COMPLETE, videoMediaEventComplete);
camera.addEventListener(Event.CANCEL, cameraCanceled);
camera.addEventListener(ErrorEvent.ERROR, cameraError);
camera.launch(MediaType.VIDEO);
}
else
{
statusText.text = "Camera not supported on this device.";
startTimer();
}
break;
}
protected function cameraCanceled(event:Event):void
{
statusText.text = "Camera access canceled by user.";
startTimer();
}
protected function cameraError(event:ErrorEvent):void
{
statusText.text = "There was an error while trying to use the camera.";
startTimer();
}
protected function videoMediaEventComplete(event:MediaEvent):void
{
statusText.text="Preparing captured video...";
camera.removeEventListener(MediaEvent.COMPLETE, videoMediaEventComplete);
camera.removeEventListener(Event.CANCEL, cameraCanceled);
camera.removeEventListener(ErrorEvent.ERROR, cameraError);
var media:MediaPromise = event.data;
data.MediaType = MediaType.VIDEO;
data.MediaPromise = media;
data.source = "camera video";
close(true,data)
}
此部分是 SkinnablePopUpContainer 的父/所有者的关闭处理程序中的 Actionscript(包含有用代码后截断)
private function choosePictureLightboxClosed(event:PopUpEvent):void
{
imageButtonsActive = false;
if(event.commit)
{
this.data = event.data as Object;
filters = new Array();
selection = true;
switch(data.MediaType)
{
case MediaType.VIDEO:
{
mediaType = "video";
trace(data.MediaPromise.file.url + " - " + data.MediaPromise.relativePath + " - " +data.MediaPromise.mediaType);
var sourceFile:File = new File(data.MediaPromise.file.url);
var destinationFile:File = File.applicationStorageDirectory.resolvePath("User" +parentApplication.userid);
if(destinationFile.exists && !destinationFile.isDirectory)
{
destinationFile.deleteFile();
}
destinationFile.createDirectory();
destinationFile = destinationFile.resolvePath("Videos");
if(destinationFile.exists && !destinationFile.isDirectory)
{
destinationFile.deleteFile();
}
destinationFile.createDirectory();
destinationFile = destinationFile.resolvePath(parentApplication.userid+"Video"+new Date().getTime()+".mov");
trace(destinationFile.nativePath);
sourceFile.moveTo(destinationFile,true);
break;
}
我当然希望这会有所帮助。这是一个非常令人沮丧的事情(而且我们的项目是由政府拨款资助的,而且我们完全没有达到最后期限),我非常希望这些来之不易的解决方案可以帮助其他人避免同样的经历。
我也在寻找这个问题的答案。现在,基于其他 Stackoverflow 讨论、对教程和 Adobe 文档的详尽阅读以及对两者的评论(通常是更有用的资源),我得出的结论是这是不可能的。
您可以使用 CameraRoll.browseForImage() 并打开 iOS 照片库以查看 MediaType.IMAGE 的所有实体,但它不会显示 MediaType.VIDEO
您可以使用 CameraUI 通过委托启动系统摄像头并返回 MediaPromise,但据我所知,它不会将您捕获的视频保存在任何地方,而且我找不到使用 MediaPromise 访问捕获的视频的方法(至少使用 Loader 类)
这是我的代码,作为该方向的提示。第二个代码块使用CameraRoll 来browseForImage(),但API 中没有browseForVideo()。
if(CameraUI.isSupported)
{
camera = new CameraUI();
camera.addEventListener(MediaEvent.COMPLETE, videoMediaEventComplete);
camera.addEventListener(Event.CANCEL, cameraCanceled);
camera.addEventListener(ErrorEvent.ERROR, cameraError);
camera.launch(MediaType.VIDEO);
}
else
{
statusText.text = "Camera not supported on this device.";
startTimer();
}
if (CameraRoll.supportsBrowseForImage)
{
roll = new CameraRoll();
roll.addEventListener(MediaEvent.SELECT, cameraRollEventComplete);
roll.addEventListener(Event.CANCEL, cameraCanceled);
roll.addEventListener(ErrorEvent.ERROR, cameraError);
roll.browseForImage();
}
else
{
statusText.text = "Camera roll not supported on this device.";
startTimer();
}