如何在不压缩的情况下从 iPhone 相册复制视频?

How to copy video from iPhone album without compression?

当我尝试使用 UIImagePickerController 将相册中的视频复制到应用时,视频被压缩了。

当在Mac上通过照片应用程序导入视频时,十秒长的视频是:

 1920x1280   ~22MB

视频导入app后,通过iTunes分享复制,压缩后的视频为:

 1280x720   ~6.3MB

如何以原始分辨率和质量将视频导入应用程序?

代码:

- (void)importVideo:(id)sender {
    UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
    imagePickerController.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    imagePickerController.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeMovie, nil];
    imagePickerController.allowsEditing = YES;
    imagePickerController.delegate = self;
    [self presentViewController:imagePickerController animated:YES completion:nil];
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    NSString *mediaType = [info objectForKey: UIImagePickerControllerMediaType];
    [self dismissViewControllerAnimated:YES completion:nil];
    if (CFStringCompare((__bridge_retained CFStringRef)mediaType, kUTTypeMovie, 0) == kCFCompareEqualTo) {
        NSURL *videoURL = [info objectForKey:UIImagePickerControllerMediaURL];
        NSData *videoData = [NSData dataWithContentsOfURL:videoURL];
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *folder = [paths firstObject];
        NSString *filename = [folder stringByAppendingPathComponent:self.uniqueFilename];
        BOOL success = [videoData writeToFile:filename atomically:NO];
        NSLog(@"Write to file %@", success ? @"OK" : @"Error");
    }
}

一旦通过GMImagePicker获得PHAsset,可以通过以下方式保存:

for (PHAsset *asset in assetArray) {
    PHVideoRequestOptions *options = [[PHVideoRequestOptions alloc] init];
    options.version = PHVideoRequestOptionsVersionOriginal;
    [[PHImageManager defaultManager] requestAVAssetForVideo:asset
                                                    options:options
                                              resultHandler:^(AVAsset *avAsset, AVAudioMix *audioMix, NSDictionary *info) {
        if ([avAsset isKindOfClass:[AVURLAsset class]]) {
            NSURL *videoURL = [(AVURLAsset *) avAsset URL];
            NSData *videoData = [NSData dataWithContentsOfURL:videoURL];
            NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
            NSString *folder = [paths firstObject];
            NSString *filename = [folder stringByAppendingPathComponent:@"foo.mp4"];
            [videoData writeToFile:filename atomically:NO];
        }
    }];
}