0

In the default photos app, Apple allows you to share videos to youtube, facebook,vimeo, etc.. I want to reproduce this function, but I record my videos in 1080p, so they are very large files. Apple solves this problem by compressing the video before uploading. I tried doing the same but failed miserably. Can anyone point me in the right direction? I found this question useful, but I can't understand why it doesn't work for me: iPhone:Programmatically compressing recorded video to share?.

Here is what I am trying:

- (void)convertVideoToLowQualityWithInputURL:(NSURL *)inputURL
                                   outputURL:(NSURL *)outputURL
                                     handler:(void (^)(AVAssetExportSession *))handler {
    [[NSFileManager defaultManager] removeItemAtURL:outputURL error:nil];
    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:inputURL options:nil];
    AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetLowQuality];
    exportSession.outputURL = outputURL;
    exportSession.outputFileType = AVFileTypeQuickTimeMovie;
    [exportSession exportAsynchronouslyWithCompletionHandler:^{

        switch ([exportSession status]) {

            case AVAssetExportSessionStatusFailed:
                NSLog(@"Export failed: %@", [[exportSession error] localizedDescription]);

                break;

            case AVAssetExportSessionStatusCancelled:

                NSLog(@"Export canceled");

                break;

            default:

                break;
        }
    }];
}

-someMethod{

    NSURL *videoURL = [NSURL fileURLWithPath:self.currentVideoURL];

    NSArray *videoSplit = [[NSString stringWithFormat:@"%@",videoURL] componentsSeparatedByString: @"."];

    NSString *first = [videoSplit firstObject];
    NSString *output = [NSString stringWithFormat:@"%@_Low_Qual.%@",first,[videoSplit objectAtIndex:1]];

    NSLog(@"VIDEO URL IS: %@",videoURL);
    NSLog(@"OUTPUT URL IS: %@",output);

    NSURL *outputURL = [NSURL fileURLWithPath:output];

    [self convertVideoToLowQualityWithInputURL:videoURL outputURL:outputURL handler: ^(AVAssetExportSession *exportSession)
     {
         if (exportSession.status == AVAssetExportSessionStatusCompleted) {
             printf("completed\n");
         }
         else {
             printf("error\n");
         }
     }];

}

However, it gives me 'Export failed: The operation could not be completed' every time. The video URL's are valid, so I don't know why it won't work. Any ideas?

Community
  • 1
  • 1
Josue Espinosa
  • 5,009
  • 16
  • 47
  • 81

1 Answers1

0

I don't know if it is the correct answer but when I changed my presetName to AVAssetExportPreset640X480, compression is working every time I run the code.

eracube
  • 2,484
  • 2
  • 15
  • 18