swift - 将视频从 UIPickerViewController 压缩到以 MB 为单位的特定大小,以便在 Swift 2 中联网

标签 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 中,但我似乎无法很好地翻译它们。

长话短说 AVFoundation 中的视频是否有类似 UIImageJPEGRepresentation 的功能?您能否发布一个从 UIPicker 中选取图像并将其文件大小更改为 1.5MB 的基本代码示例?

最佳答案

我在其中一个项目中有一个类似的任务,并使用 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];
}

希望对您有所帮助:)

关于swift - 将视频从 UIPickerViewController 压缩到以 MB 为单位的特定大小,以便在 Swift 2 中联网,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36684159/

相关文章:

objective-c - exportAsynchronouslyWithCompletionHandler 因多个视频文件而失败(代码=-11820)

swift - 二元运算符 '..<' 不能应用于两个 'Int' 操作数 [Swift]

video - 从 NetLogo 创建视频

arrays - didSelectRowAt 更改所有行中的值

javascript - 为什么 Safari 允许基于滚动的视频按预期工作,而其他浏览器则不允许?

javascript - 如何对我网站上的 .css 和 .js 文件使用 gzip 压缩?

http - IIS 7.5 似乎没有使用动态压缩

linux - 为什么同一文件的两个 tarball 的 md5 散列不同?

ios - timescale 和 fps 有什么区别?

ios - 在 Swift 中以编程方式更改推送通知