像Apple一样压缩视频共享?

时间:2014-03-27 19:22:23

标签: ios objective-c cocoa-touch cocoa avfoundation

在默认照片应用程序中,Apple允许您分享视频到youtube,facebook,vimeo等。我想重现这个功能,但我用1080p录制我的视频,所以它们是非常大的文件。 Apple通过在上传之前压缩视频来解决此问题。我尝试过同样但却失败了。谁能指出我正确的方向?我发现这个问题很有用,但我无法理解为什么它对我不起作用:iPhone:Programmatically compressing recorded video to share?

以下是我的尝试:

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

}

然而,它让我“导出失败:操作无法完成'每次。视频网址有效,因此我不知道为什么它不会工作。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我不知道这是否是正确答案但是当我将presetName更改为AVAssetExportPreset640X480时,每次运行代码时压缩都会正常工作。