在上传到服务器之前压缩视频和图像

Posted

技术标签:

【中文标题】在上传到服务器之前压缩视频和图像【英文标题】:Compress video and images before uploading to server 【发布时间】:2017-02-01 03:06:07 【问题描述】:

将图像和视频一起上传到服务器。用户最多可以选择 5 个图像和 5 个视频。所以在上传之前需要减小视频和图像的大小。请指导。 下面是我正在尝试的。为图像做了一些事情,但对视频压缩一无所知。

// images

if  let imageData1 = UIImageJPEGRepresentation(User.sharedInstance.arrRoomGalleryImages.objectAtIndex(index) as! UIImage, 0.6)               
    multipartFormData.appendBodyPart(data: imageData1, name: "image_path[]", fileName: strImgName, mimeType: "image/png")

// 视频

let strVidName = "vid" + String(index) // + ".mov"

multipartFormData.appendBodyPart(data: User.sharedInstance.arrRoomGalleryVideos.objectAtIndex(index) as! NSData, name: "video_path[]", fileName: strVidName, mimeType: "application/octet-stream")

【问题讨论】:

【参考方案1】:

您可以将每个原始 .mov 文件转换为 .mp4 压缩文件,然后再将视频上传到您的服务器。以下是 SWIFT 3 中的方法:

首先,创建这个封装压缩过程的函数。请注意,压缩文件是一个异步任务:

func compressVideo(inputURL: URL, outputURL: URL, handler:@escaping (_ exportSession: AVAssetExportSession?)-> Void) 
                let urlAsset = AVURLAsset(url: inputURL, options: nil)
                guard let exportSession = AVAssetExportSession(asset: urlAsset, presetName: AVAssetExportPresetMediumQuality) else 
                    handler(nil)
                    return
                

                exportSession.outputURL = outputURL
                exportSession.outputFileType = AVFileTypeMPEG4 //AVFileTypeQuickTimeMovie (m4v)
                exportSession.shouldOptimizeForNetworkUse = true
                exportSession.exportAsynchronously  () -> Void in
                    handler(exportSession)
                
            

现在您可以通过这种方式使用 compressVideo:

// Put in fileURL the URL of the original .mov video
let compressedURL = NSURL.fileURL(withPath: NSTemporaryDirectory() + NSUUID().uuidString + ".mp4")
let compressedFileData : Data? =  nil

// Encode to mp4
compressVideo(inputURL: fileURL, outputURL: compressedURL, handler:  (_ exportSession: AVAssetExportSession?) -> Void in

    switch exportSession!.status 
        case .completed:

        print("Video compressed successfully")
        do 
            compressedFileData = try Data(contentsOf: exportSession!.outputURL!)
            // Call upload function here using compressedFileData
         catch _ 
            print ("Error converting compressed file to Data")
        

        default:
            print("Could not compress video")
    
 )

现在您可以像往常一样将compressedFileData 上传为多部分“image/mp4”文件

【讨论】:

在我使用它之前,上传的视频大约是 10.5 MB,我使用它之后,仍然是大约 10.5 MB。我能做什么? 你真的帮了我大忙 :) 问题:如果视频真的非常大怎么办。如果我尝试创建一个尝试存储所有数据的变量(此处为compressedFileData),这不会导致应用程序崩溃吗?我只是想知道.... @FaridAlHaddad 也许您的文档已经是 mp4。此代码只是将 .mov 转换为 .mp4 这是为了转换为 mp4 而不是压缩视频。下次答案应该会更清楚。

以上是关于在上传到服务器之前压缩视频和图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中以编程方式上传到服务器之前减小视频的大小[关闭]

如何在将图像上传到 Firebase 存储之前对其进行压缩?

在上传到Google Cloud存储之前调整图像大小并进行压缩

如何在上传到 Firebase 存储之前压缩 Expo 中的视频?

上传到 S3 之前的 AWS 临时文件?

在上传之前在客户端压缩图像[关闭]