将视频从UIPickerViewController压缩到特定大小,以MB为单位,用于Swift 2中的网络

时间:2016-04-18 01:34:09

标签: swift video compression avfoundation uiimagepickercontroller

我正在尝试从UIPickerViewController中选择一个视频,将视频压缩到大约1.5MB,并将其发布到服务器。

我已经能够选择图像并成功发布。我也可以选择一个视频并成功发布。问题是,由于视频文件大约是27MB,因此一旦发送就太大了。因此,当尝试从服务器播放视频时,时间显示“ - ”。如果我选择较小的视频,它将完美地发布和播放。

我知道问题的大小是因为我使用了另一个应用来压缩视频,然后使用我的应用将其发送到服务器。它运作得很好。

我花了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 AVFoundation中的视频是否有类似UIImageJPEGRepresentation的功能?您能否发布从UIPicker中选择图像并将其文件大小更改为1.5MB的基本代码示例?

1 个答案:

答案 0 :(得分: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];
}

希望有所帮助:)