2015-04-13 5 views
2

Возможно, большинство из вас использует WhatsApp, и вы, вероятно, знаете, что, когда вы хотите отправить видео одному из ваших контактов WhatsApp, прежде всего, сжимать видео до максимального размера 16 МБ и только послесловие он загружает выбранное видео в ваш контакт.Как сжать видео до точного размера в объективе c?

то, что я пытаюсь сделать, это то же самое, что и с использованием AV Foundation или для более конкретного AVAssetExportSession.

вот мой код:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 



     NSURL *videoURL = info[UIImagePickerControllerMediaURL]; 
     NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
     NSString *sourcePath =[documentsDirectory stringByAppendingString:@"/output.mov"]; 
     NSURL *outputURL = [NSURL fileURLWithPath:sourcePath]; 

     [self convertVideoToLowQuailtyWithInputURL:videoURL outputURL:outputURL handler:^(AVAssetExportSession *exportSession) 
     { 
      if (exportSession.status == AVAssetExportSessionStatusCompleted) 
      { 
       NSLog(@"completed"); 
      } 
      else 
      { 
       NSLog(@"error: %@",exportSession.error); 
      } 
     }]; 

     [picker dismissViewControllerAnimated:YES completion:NULL]; 
} 

- (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:AVAssetExportPresetMediumQuality]; 
    exportSession.outputURL = outputURL; 
    exportSession.outputFileType = AVFileTypeQuickTimeMovie; 

    [exportSession exportAsynchronouslyWithCompletionHandler:^(void) 
    { 
     handler(exportSession); 
    }]; 

} 

этот код работает замечательно, он принимает видео и сжатие его очень маленького размера.

проблема заключается в том, что пользователь пытается загрузить довольно длинное видео с мощной камерой, размер которой не достаточно мал для меня.

Что я хочу сделать, это на самом деле сжать любое видео до ограниченного размера. позволяет говорить, например, 16Mb, как WhatsApp. Как я могу это сделать?

+0

Пройтись ссылке ниже [http://stackoverflow.com/ вопросы/23342964/видео-сжатия-ИОС-уменьшения-в-размер-о-а-видео-Usin-avassetwriter RQ = 1] [1] [1]: http://stackoverflow.com/вопросы/23342964/видео-сжатия КСН-свертка-на-размер-оф-а-видео-нас в-avassetwriter? rq = 1 – ios

+0

@Ravi в добавленной вами ссылке есть только настройки того, как будет выглядеть видео после компрессии, то есть на самом деле это решение, но есть много недостающего кода, и я до сих пор не знаю как работать с этим маленьким фрагментом кода. вы можете помочь? –

+0

Значение видео 4k и 1080p будет иметь такое же качество в конце? так адаптируемое сжатие на whatsapp? –

ответ

3

Не похоже, что это простой способ, но AVAssetExportSession имеет ориентировочную оценкуOutputFileLenght, которая могла бы помочь.
В моем коде я перебирать различные качества и убедитесь, что размер файла в размере Я хочу:

NSURL * inputURL = [NSURL fileURLWithPath:path]; 
    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:inputURL options:nil]; 
    AVAssetExportSession *exportSession = nil; 
    for (NSString * string in @[AVAssetExportPresetHighestQuality,AVAssetExportPresetMediumQuality,AVAssetExportPresetLowQuality]) { 
     exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:string]; 
     exportSession.shouldOptimizeForNetworkUse = YES; 
     exportSession.outputFileType = AVFileTypeMPEG4; 
     exportSession.timeRange = CMTimeRangeMake(kCMTimeZero, asset.duration); 
     unsigned long long espectedFileSize = exportSession.estimatedOutputFileLength; 
     if (espectedFileSize < VIDE_LIMIT) { 
      break; 
     } 

    } 
    //Temp file 

    NSString *fileName = [NSString stringWithFormat:@"%@_%@", [[NSProcessInfo processInfo] globallyUniqueString], @"video.mov"]; 
    NSString * filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:fileName]; 
    NSURL *fileURL = [NSURL fileURLWithPath:filePath]; 
    exportSession.outputURL = fileURL; 
    [exportSession exportAsynchronouslyWithCompletionHandler:^(void) 
+0

Ваше решение действительно очень приятно, но на самом деле это точно так же, как и я. Самое высокое качество обычно больше, чем 16 МБ, а LowQuality слишком низка для меня. см. эту [link] (https://developer.apple.com/library/ios/documentation/AudioVideo/Conceptual/AVFoundationPG/AVFoundationPG.pdf), если вы понимаете, как работать с этим, потому что я немного запутался внутри. –

+0

AVAssetExportSession - это не единственный способ достичь этого, если вам нужно больше контроля, вы можете использовать комбинацию AVAssetReader/AVAssetWriter, но я никогда не пробовал. Я нашел эту статью, что, по-моему, это может быть полезно для вас http://finalize.com/2014/10/21/exporting-a-video-in-ios-to-reduce-size-and-ensure-maximum -client совместимость / – Andrea

Смежные вопросы