将视频保存到相册很慢

时间:2011-10-20 21:24:20

标签: ios avfoundation

Apple的相机应用程序似乎将视频直接保存到相册中。我想知道这种能力是否可以由我们凡人开发者完成。

我遇到并测试了这两种方法,将视频文件复制到相册中。文件越大,保存时间越长。创建2分钟可以在保存时间内有所不同。我有两个时间,45秒和1分12秒复制到大小约150MB的文件。 Apple Camera应用程序中大小相近的文件只需6秒钟。

我查看了AVCam演示代码,它使用了我已经测试过的两种方法之一。

ALAssetsLibrary实例方法writeVideoAtPathToSavedPhotosAlbum:completionBlock:
UIKit功能UISaveVideoAtPathToSavedPhotosAlbum

我正在使用AVFoundation连接相机并打开文件流。对于上下文,以下是我打开该文件的位置。 movieURLPath是我的应用程序文档目录区域中的文件引用。

outputWriter = [AVAssetWriter assetWriterWithURL: [projectPaths movieURLPath]  fileType: AVFileTypeQuickTimeMovie error: &error];

当通过停止录制关闭文件时,我最终会到达这一行。

UISaveVideoAtPathToSavedPhotosAlbum ([projectPaths movieFilePath], self, @selector(video:didFinishSavingWithError: contextInfo:), nil);

有没有人有其他选择来加快写作过程?显然,我的首选是将movieURLPath指向PhotosAlbum中的文件。最好在该文件夹中打开文件,这就是我认为Apple所做的。

3 个答案:

答案 0 :(得分:0)

您可以尝试将其移至后台线程或使用GCD,这样您的UI就不会被阻止。在这里查看如何使用GCD。

http://developer.apple.com/library/mac/#featuredarticles/BlocksGCD/_index.html

答案 1 :(得分:0)

我不确定Camera应用程序是如何工作的,但我知道如何修复我的应用程序中的相同问题。

使用WWDC 2010中的相同AVCam代码示例,在AVCamCaptureManager下,您可以找到以下消息:

- (NSURL *) tempFileURL
{
    return [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@%@", NSTemporaryDirectory(), @"output.mov"]];
}

我所做的是将其更改为以下内容:

- (NSURL *) tempFileURL
{
    return [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@%@", [NSHomeDirectory() stringByAppendingPathComponent: @"Documents"], @"output.mov"]];
}

将所有相机输出转储到应用程序文档文件夹。现在我需要做的就是当录制结束时将临时文件重命名为文件夹中的唯一内容,这是一个非常快速的过程,不依赖于文件大小。

我已经为用户提供了将文件保存到库的选项,但它仍然是一个非常漫长的过程。我找不到使用ALAssetsLibrary的更好的解决方案。很想听听真正有用的东西!

PS。如果您正在开发IO5,我确信苹果完全由于iCloud而更改/替换了该框架。

PS2。我真的相信Apple在相机应用程序上做了同样的事情,但是这个API不可用。

答案 2 :(得分:0)

在后台运行该代码(如logan建议):

#define ASYNC(block) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block)

ASYNC(^{
    // save to photo album
});