使用AVFoundation录制的视频可以直接写入资产库吗?

时间:2012-10-17 05:15:12

标签: video avfoundation alassetslibrary

我正在使用AVFoundation使用以下方法将视频录制到NSTemporaryDirectory。

[[self movieFileOutput] startRecordingToOutputFileURL:[self outputFileURL] recordingDelegate:self];

录制停止后

[library writeVideoAtPathToSavedPhotosAlbum:outputFileURLcompletionBlock:^(NSURL *assetURL, NSError *error)`
调用

方法。

我注意到,当视频从临时目录写入照片库时,它会保留在那里直到保存完成。

这对我没有意义,因为它在保存视频时需要加倍的磁盘空间。例如,如果我录制一小时长的1080p视频,则在录制结束时磁盘上的大小为5GB,但在删除临时文件并释放磁盘空间之前保存到照片库时最大为10GB。 / p>

很想听听你对此的看法。

2 个答案:

答案 0 :(得分:0)

我认为,最好将视频暂时存储到文档目录中 .mp4

然后保存到Document-directory并在保存后将其删除。

NSString *videoPath = [[self getDirectoryPath:[NSString stringWithUTF8String:currentRequest.fileName]] retain];

 NSURL *videoPathURL = [NSURL URLWithString:videoPath];                 

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];  

[library writeVideoAtPathToSavedPhotosAlbum:videoPathURL completionBlock:^(NSURL *assetURL, NSError *error) { 

       //Delete "videoPath" file from Document directory

}]; 


-(NSString *)getDirectoryPath:(NSString *)fileName {        

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *path = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.mp4",fileName]];
    return path;

}

答案 1 :(得分:0)

似乎在录制时无法直接在照片库中写入视频文件。但是您可以将在应用程序目录中写入的文件(例如临时文件,文档等)移动到照片库中,而不用复制文件。因此,您可以避免在设备上有多余的空间,以便将录制的文件保存在照片库中。

我在下面添加了确切的API,可用于将记录的文件移动到照片库。

PHPhotoLibrary.shared().performChanges({
    let options = PHAssetResourceCreationOptions()
    options.shouldMoveFile = true
    let creationRequest = PHAssetCreationRequest.forAsset()
    creationRequest.addResource(with: .video, fileURL: outputFileURL, options: options)
}, completionHandler: { success, error in
    if !success {
        print("Couldn't save the movie to your photo library: \(String(describing: error))")
    }
    cleanup()
   }
)

上面示例中将文件移动到照片库的主要部分是

let options = PHAssetResourceCreationOptions()
options.shouldMoveFile = true