如何将多个视频保存到应用程序文档目录?

3

我正在使用GMImagePicker来获取相机胶卷的资源。选择单个或多个视频后,我会在数组中获得PHAsset。 assetArray的数据格式如下:

 "<PHAsset: 0x7fe0e8f21130> 40D4733D-4C7B-443D-8093-C28E39ACA45E/L0/001 mediaType=2/0, sourceType=1, (720x480), creationDate=2016-02-14 09:50:58 +0000, location=0, hidden=0, favorite=0 " 

我该如何将这个视频存储到我的应用程序文档目录中?我用来存储视频的代码是:
for (PHAsset *asset in assetArray) {

        if (asset.mediaType==PHAssetMediaTypeVideo) {
            NSLog(@"Video found");
        }
        PHVideoRequestOptions *options = [[PHVideoRequestOptions alloc] init];
        options.version = PHVideoRequestOptionsVersionOriginal;

        [[PHImageManager defaultManager] requestAVAssetForVideo:asset options:options resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) {

            if ([asset isKindOfClass:[AVURLAsset class]]) {
                NSURL *URL = [(AVURLAsset *)asset URL];

               NSMutableData *responseData=[[NSMutableData alloc] init];
               responseData = [NSMutableData dataWithContentsOfURL:URL];
                if (responseData.length>0) {
                        NSString * lastPath = [URL.absoluteString lastPathComponent];//videoname.mp4
                        NSString *docDirPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES)objectAtIndex:0];
                        NSString *filePath = [NSString stringWithFormat:@"%@/%@",docDirPath,lastPath];

                       [responseData writeToFile:filePath atomically:YES];
            }
        }];

       }

我也检查了视频保存的文件路径。视频是可用的,但我遇到了这个错误。
 Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'

请帮我解决这个问题。

2个回答

0

据我所知,应该使用NSMutableData而不是NSData,因为它可以接受空值。

self.responseData = [NSMutableData dataWithContentsOfURL:location];
if (self.responseData.length>0) {
        dispatch_async(dispatch_get_main_queue(), ^{
        NSString * lastPath = [url.absoluteString lastPathComponent];//videoname.mp4
        NSString *docDirPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES)objectAtIndex:0];
        NSString *filePath = [NSString stringWithFormat:@"%@/%@",docDirPath,lastPath];
            [self.responseData writeToFile:filePath atomically:YES];
}
    });

希望这可以帮到你。

请提供完整的错误日志。或者在任何浏览器上检查您的URL。它是否正在下载数据? - iamVishal16
因未捕获到异常'NSInvalidArgumentException',应用程序终止。原因:'*** -[__NSArrayM insertObject:atIndex:]:对象不能为空' - Mitesh Dobareeya
我在Safari中检查了URL。它完全运行视频。 - Mitesh Dobareeya
最后一行:[self.responseData writeToFile:filePath atomically:YES]; - Mitesh Dobareeya
请检查此URL对象。它是否具有与您的视频相同的URL?NSURL * URL = [(AVURLAsset *)asset URL]; - iamVishal16
是的,这就是我选择的同一个视频,我在Safari中检查了URL。 - Mitesh Dobareeya

0

用于存储图片和视频

 for (PHAsset *asset in assetArray) {

        if (asset.mediaType==PHAssetMediaTypeVideo) {
            NSLog(@"Video found");

            PHVideoRequestOptions *options = [[PHVideoRequestOptions alloc] init];
            options.version = PHVideoRequestOptionsVersionOriginal;

            [[PHImageManager defaultManager] requestAVAssetForVideo:asset options:options resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) {

                if ([asset isKindOfClass:[AVURLAsset class]]) {
                    NSURL *URL = [(AVURLAsset *)asset URL];
                   [Albumvideos addObject:URL];
                    NSData *videoData = [NSData dataWithContentsOfURL:URL];
                    if (videoData.length>0) {
                        NSString *lastPath = [URL.absoluteString lastPathComponent];
                        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
                        NSString *documentsDirectory = [paths objectAtIndex:0];
                        NSFileManager *fileManager = [NSFileManager defaultManager];
                        NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@-%@",TimeStamp,lastPath]];
                        [fileManager createFileAtPath:fullPath contents:videoData attributes:nil];   
                    }
                }
            }]; 
        }
else{

    self.requestOptions = [[PHImageRequestOptions alloc] init];
    self.requestOptions.resizeMode   = PHImageRequestOptionsResizeModeExact;
    self.requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;

    // this one is key
    self.requestOptions.synchronous = true;

    //  self.assets = [NSMutableArray arrayWithArray:assets];
    PHImageManager *manager = [PHImageManager defaultManager];

    // assets contains PHAsset objects.
    __block UIImage *ima;


        // Do something with the asset

        [manager requestImageForAsset:asset
                           targetSize:PHImageManagerMaximumSize
                          contentMode:PHImageContentModeDefault
                              options:self.requestOptions
                        resultHandler:^void(UIImage *image, NSDictionary *info) {
                            ima = image;

                            [Albumimages addObject:ima];

                        }];

}
}

Albumvideos 是一个可变数组,其中包含视频 URL,而 Albumimages 包含所选图像。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接