携帯電話で3つのビデオをキャプチャしました。これは、デフォルトで電話ギャラリー(Gallery / videos /)に保存されています。フレックスモバイルアプリケーションの1つでこれらの3つのビデオを再生する必要があります。フレックスプロジェクトにビデオを送るにはどうすればよいですか?モバイルディレクトリを閲覧する必要がある場合は、そのためのコードを教えてください。
2 に答える
私もこの質問に対する答えを探しています。現在、他のStackoverflowのディスカッション、チュートリアルとAdobeドキュメントの徹底的な閲覧、および両方へのコメント(多くの場合、より有用なリソース)に基づいて、それは不可能であるという結論に達しています。
CameraRoll.browseForImage()を使用して、写真のiOSギャラリーを開いて、MediaType.IMAGEのすべてのエンティティを表示できますが、MediaType.VIDEOは表示されません。
CameraUIを使用して委任によってシステムカメラを起動すると、MediaPromiseが返されますが、私が知る限り、キャプチャしたビデオはどこにも保存されず、MediaPromiseを使用してキャプチャしたビデオにアクセスする方法が見つかりません(少なくともLoaderクラスを使用して)
これがその方向へのヒントとしての私のコードです。2番目のコードブロックは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();
}
それ以来、委任されたシステムカメラを使用してキャプチャされたビデオは、iOS -DOES!-がアクセスを許可する一時的な保存場所に保存されていることがわかりました。(私は嬉しいショックを受けました。)
キャプチャされたビデオは、iOSシステムカメラアプリを使用してキャプチャされた他のビデオのようにデバイスのカメラロールに追加されないため、ビデオをキャプチャして後でアクセスできると期待するだけでは不十分です(たとえば、CameraRoll.browseForVideo()がAPIに追加されたことはありません。
したがって、「取得が良好な間に取得」し、ファイルを一時的な保存場所からApplicationStorageDirectoryやユーザーのDocumentsディレクトリなどの不揮発性の場所に移動する必要があります(iOSの唯一のオプションだと思います)。
MediaPromise ...私は...直接プログレッシブローダー/ストリーマー方式でビデオにアクセスするのにはまったく役に立たないと思いますが、一時ファイルの場所/ url /パス/ファイル名を提供するので、ファイル操作を実行できます。
CameraRoll.browseForImage()を使用するときにMediaPromiseにファイルの場所/ url / path / filenameの不足を回避するためのチュートリアルがあるのは皮肉です...そしてそのメソッドはローダークラスを使用して画像コンテンツをロードすることです(その後、ファイルに書き出すことができます)が、ビデオを撮影する場合、ビデオコンテンツにアクセスできず、代わりにファイルの場所/URL/パス/ファイル名が提供されます。皮肉なことに、これを支援するために私が見つけることができたリソースはほとんどありません。不平を言う
ベッドにいる必要があるときはずっと過ぎているので、余分なビットを取り除くために実際に編集せずにいくつかのコードチャンクを含めるつもりですが、これを持ってほしいと思いました。後で片付けに来るかもしれません。
このセクションはSparkSkinnablePopUpContainerにあり、複数のボタンに同じクリックイベントを使用しているため、以下の「ケース」はそのイベントハンドラー関数のスイッチケースに含まれています。
よく知らない場合は、「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;
}
これがお役に立てば幸いです。これは非常に苛立たしいことであり(そして私たちのプロジェクトが政府の助成金を受けており、期限を完全に守れなかったという点でコストがかかります)、これらの苦労して獲得したソリューションが他の人が同じ経験を避けるのに役立つことを願っています。