Как сжать видеоданные перед загрузкой в ​​iOS

У меня проблема со сжатыми видеоданными (видеоданные получены от ALASSET). Я хочу сжать видеоданные перед загрузкой на сервер. Я нашел приведенную ниже функцию для преобразования в низкое качество, но вывод NSURL, а не NSDATA. Как я могу сжать NSData видео перед загрузкой.

Это моя функция загрузки:

ALAsset *alasset = [allVideos objectAtIndex:i];
ALAssetRepresentation *rep = [alasset defaultRepresentation];
NSString * videoName = [rep filename];
Byte *buffer = (Byte*)malloc(rep.size);
NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:rep.size error:nil];
NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];

И это функция преобразования:

    - (void)convertVideoToLowQuailtyWithInputURL:(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:^(void)
     {
         handler(exportSession);
         [exportSession release];
     }];
}

person user3214941    schedule 03.03.2014    source источник
comment
Почему бы просто не передать file-url в качестве значения outputURL:, а затем загрузить файл в ваш экземпляр NSData?   -  person aroth    schedule 03.03.2014
comment
@aroth: можешь привести пример кода? Благодарность   -  person user3214941    schedule 03.03.2014
comment
@user3214941 user3214941 ты нашел хорошее решение? Я столкнулся с той же проблемой   -  person FabKremer    schedule 14.07.2015


Ответы (1)


Ниже код работает отлично для меня:

asset = [[AssetItem alloc] initWithURL:movieURL];
            NSLog(@"Start");
            asset.exportSession.shouldOptimizeForNetworkUse = TRUE;
            asset.preset = AVAssetExportPresetMediumQuality;
            asset.exportSession.outputFileType = @"public.mpeg-4";
            [asset exportAssetWithCompletionHandler:^(NSError *error){
                dispatch_async(dispatch_get_main_queue(), ^{
                    if (error != nil)
                    {
                        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:[error localizedDescription]
                                                                            message:[error localizedFailureReason] delegate:self
                                                                  cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
                        [alertView show];
                    }
                });
            }];
person Yashesh    schedule 09.07.2014
comment
Что за класс AssetItem? Я знаю только AVAsset. Я пробовал точно такой же код, что и стартер потока, но всегда получал ошибку «не удалось завершить». К сожалению, ошибка очень неспецифична. - person dannyyy; 16.07.2014
comment
-1 -- Это неполная информация, если загрузить образец кода Apple по ссылке, указанной в комментарии, то будет замечено, что -- AssetItem на самом деле является подклассом NSObject. - person Shailesh; 14.08.2014