问题描述
由于内存警告,当我从照片库中选择多个视频(每个 1 分钟以上)时,我的应用程序崩溃。我正在尝试压缩视频,但尽管压缩代码工作正常,但仍然存在同样的问题。我希望我的应用程序一次选择 5 个视频并在聊天中发送它们。 Whatsapp 允许用户选择 30 个视频并在聊天中发送它们,但我的应用程序因仅在 3 个视频后出现内存问题而崩溃。 我正在使用“AssetsPickerViewController”库进行多个图片/视频选择。
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,isImages: isImages)
}
} else {
mediaData.append(data)
self.checkFileStatus(mediaCount: mediaData.count,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,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)
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)