1

Я пытаюсь выбрать видео из UIPickerViewController, сжать видео до 1,5 МБ и отправить его на сервер.Сжатие видео с UIPickerViewController до определенного размера в MB для сети в Swift 2

Я уже могу выбрать изображение и опубликовать сообщение успешно. Я также могу выбрать видео и успешно опубликовать его. Проблема в том, что, поскольку видеофайл составляет около 27 МБ, он слишком велик для воспроизведения после отправки. Поэтому, когда вы пытаетесь воспроизвести видео с сервера, время показывает «-». Если я выберу меньшее видео, оно будет прекрасно воспроизводиться и воспроизводиться.

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

Я потратил более 5 часов на эту проблему и, похоже, не могу понять это сам. (Просто сказать, что я пытался решить и найти ответы сам)

Я попытался реализации этих методов:

https://gist.github.com/daltheman/4716ec10d6d0f71aba56

https://developer.apple.com/library/tvos/documentation/Performance/Reference/Compression/index.html#//apple_ref/c/func/compression_encode_buffer

https://snackcoffee.me/2015/11/29/zlib-swift-2/

IOS Video Compression Swift iOS 8 corrupt video file

и несколько других, которые больше не находятся на моих вкладках , Некоторые из них были в Objective-C, но я не мог перевести их хорошо.

TL; DR Есть ли функция, как UIImageJPEGRepresentation видео в AVFoundation? Не могли бы вы привести пример базового кода для выбора изображения из UIPicker и изменения его размера файла до 1,5 МБ?

ответ

0

Я был похож на задачи в одном из проектов и используется AVAssetExportSession для сжатия видео:

- (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.shouldOptimizeForNetworkUse = YES; 
exportSession.outputFileType = AVFileTypeQuickTimeMovie; 
[exportSession exportAsynchronouslyWithCompletionHandler:^(void) 
{ 
    handler(exportSession); 
}];} 

Вы можете выбрать несколько типов Качество:

AVF_EXPORT NSString *const AVAssetExportPresetLowQuality  NS_AVAILABLE(10_11, 4_0); 
AVF_EXPORT NSString *const AVAssetExportPresetMediumQuality  NS_AVAILABLE(10_11, 4_0); 
AVF_EXPORT NSString *const AVAssetExportPresetHighestQuality NS_AVAILABLE(10_11, 4_0); 

А затем проверить размер выходного с функцией, как это:

- (NSString *)sizeOfLocalURL:(NSURL *)url { 
NSData *fileData = [[NSData alloc] initWithContentsOfURL:url]; 
return [NSString stringWithFormat:@"%.2f mb", fileData.length/1000000.00]; 
} 

Надеется, что это помогает :)

+0

Yea theres точно так же, как в другом вопросе, и я попытался его реализовать, но так как я не знаю объективного c, что хорошо (код в swift), что-то должно затеряться в переводе. –