【问题标题】:How to save multiple videos into application document directory?如何将多个视频保存到应用程序文档目录中?
【发布时间】:2016-06-24 20:24:34
【问题描述】:

我正在使用 GMImagePicker 来获取相机胶卷的资产。 选择单个或多个视频后,我在 arrayArray 中获得了 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'

请帮我解决这个问题。

【问题讨论】:

    标签: ios objective-c video nsdocumentdirectory phasset


    【解决方案1】:

    用于存储图像和视频

     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 包含选定图像。

    【讨论】:

      【解决方案2】:

      据我说使用 NSMutableData 而不是 NSData 它接受 Nullable 值

      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];
      }
          });
      

      希望对你有所帮助。

      【讨论】:

      • 请提供完整的错误日志。或在任何浏览器上检查您的网址。是不是在下载数据?
      • 由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
      • 我在 safari 中检查了 URL。它完全运行的视频
      • 最后一行 [self.responseData writeToFile:filePath atomically:YES];
      • NSURL *URL = [(AVURLAsset *)asset URL];请检查此 URL 对象。它是否与您的视频具有相同的网址?
      猜你喜欢
      • 1970-01-01
      • 2012-12-23
      • 2019-07-05
      • 1970-01-01
      • 1970-01-01
      • 2015-02-04
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多