【问题标题】:Compress Video from UIPickerViewController to Specific Size in MB for Networking in Swift 2将来自 UIPickerViewController 的视频压缩为特定大小(以 MB 为单位),以便在 Swift 2 中进行网络连接
【发布时间】:2016-04-18 01:34:08
【问题描述】:

我正在尝试从 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 的基本代码示例?

【问题讨论】:

    标签: swift video compression avfoundation uiimagepickercontroller


    【解决方案1】:

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

    希望对你有帮助:)

    【讨论】:

    • 是的,另一个问题中的代码与此完全相同,我已经尝试实现它,但是由于我不太了解目标 c(我在 swift 中编写代码),所以肯定会丢失一些东西翻译。
    猜你喜欢
    • 1970-01-01
    • 2019-03-16
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 2014-06-12
    相关资源
    最近更新 更多