Priyanka
Priyanka

Reputation: 1

iOS App is crashing when selecting multiple videos from photo library - memory warning

My app is crashing when I select multiple videos(1+ min each) from photo library because of memory warning. I'm trying to compress videos but still the same issue although compression code is working properly. I want my app to select 5 videos at once and send them in chat. Whatsapp is allowing the user to select 30 videos and send them in chat but my app is crashing because of memory issues after 3 videos only. I am using "AssetsPickerViewController" lib for multiple pic/video selection.

func assetsPicker(controller: AssetsPickerViewController, selected assets: [PHAsset]) {
    self.dismiss(animated: true, completion: nil)
    
    var isImages = false
    var mediaData: [Data] = []
    let imageManager = PHCachingImageManager.default()
    DispatchQueue.main.async {
        self.appDelegate.helper.showHUD(withMessage: "Preparing media", withObject: self)
    }
    autoreleasepool {
        for selectedAsset in assets {
            if selectedAsset.mediaType == .image {
                isImages = true
                let option = PHImageRequestOptions()
                option.isSynchronous = true
                option.isNetworkAccessAllowed = true
                
                imageManager.requestImageData(for: selectedAsset, options: option) { (assetData, assetDataUTI, assetOrientation, assetInfo) in
                    if let data = assetData {
                        if let image = UIImage(data: data)?.upOrientation(), let finalData = image.jpegData(compressionQuality: 0.5) {
                            if let newData = ImageHelper.removeExifData(data: finalData as NSData) {
                                mediaData.append(newData as Data)
                                self.checkFileStatus(mediaCount: mediaData.count, assetsCount: assets.count, data: mediaData, isImages: isImages)
                            } else {
                                mediaData.append(finalData)
                                self.checkFileStatus(mediaCount: mediaData.count, assetsCount: assets.count, data: mediaData, isImages: isImages)
                            }
                        } else {
                            mediaData.append(data)
                            self.checkFileStatus(mediaCount: mediaData.count, assetsCount: assets.count, data: mediaData, isImages: isImages)
                        }
                    }
                }
            } else if selectedAsset.mediaType == .video {
                let options: PHVideoRequestOptions = PHVideoRequestOptions()
                options.isNetworkAccessAllowed = true
                options.deliveryMode = .fastFormat
                self.convertVideo(phAsset: selectedAsset) { (data) in
                    if let finalData = data {
                        mediaData.append(finalData)
                        self.checkFileStatus(mediaCount: mediaData.count, assetsCount: assets.count, data: mediaData, isImages: isImages)
                    } else {
                        
                    }
                    
                }
            }
        }
    }
}

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 = AVFileType.mp4
   exportSession.shouldOptimizeForNetworkUse = true
   exportSession.exportAsynchronously { () -> Void in
       handler(exportSession)
   }

}

Upvotes: 0

Views: 254

Answers (0)

Related Questions