8月更文挑战 |iOS端录视频不保存到系统相册功能

309 阅读2分钟

功能:iOS端使用UIImagePickerController选择视频,之后使用TZImagePickerController库进行视频的保存。

需求变化:

选择完视频之后,不希望用户直接保存到系统的相册中,

解析:

查看代码可以看到TZImagePickerController使用TZImageManager().saveVideo进行视频保存,所需要提供的参数是一个URL对象, 返回PHAsset对象。 之后再用TZImageManager().getVideoOutputPath拿到保存之后解析出来的mp4文件格式的路径,进行操作。

问题点:

1,iOS端使用系统录视频得到的格式是mov格式。需要转换成mp4格式。 2,使用PHAsset对象获取信息,必须先保存到系统的相册,从资源库去取信息

解决:

1,获取到mov格式路径的资源,通过TZImageManager().saveVideo方法保存之后,直接删除

//删除视频
PHPhotoLibrary.shared().performChanges {
    PHAssetChangeRequest.deleteAssets([asset] as NSArray)
} completionHandler: {(_:Bool, error: Error!) in
}

但是这样操作的话,iOS系统会给用户一个明显的提示。是否允许用户进行删除操作。

2,获取到mov格式对象之后,进行转码操作,不使用TZImageManager().saveVideo进行存储。具体转码代码如下:

//不保存视频到相册,实现直接将mov转到mp4
let date = Date()
let formatter = DateFormatter.init()
formatter.dateFormat = "yyyy-MM-dd-HH-mm-ss"

let fileName = formatter.string(from: date) + ".mp4"
//获取系统的文件路径,下面是笔者自己做的封装函数
letpath = FileUtil().documentPath(subFolder: FileUtil.FOLDER_VIDEOS).path
let videoSandBoxPath = path + "/video-" + fileName
print(videoSandBoxPath)
//转码配置
letavAsset = AVURLAsset.init(url: url, options: **nil**)
//取视频的时间并处理,用于上传

let exportSession = AVAssetExportSession.init(asset: avAsset, presetName: AVAssetExportPresetMediumQuality)
exportSession?.shouldOptimizeForNetworkUse = **true**
exportSession?.outputURL = URL.init(fileURLWithPath: videoSandBoxPath) exportSession?.outputFileType = AVFileType.mp4 //控制转码的格式
exportSession?.exportAsynchronously(completionHandler: {
if exportSession?.status == AVAssetExportSession.Status.failed {
     print("转码失败")
}
if exportSession?.status == AVAssetExportSession.Status.completed {
    print("转码成功")
    //上传视频的话是需要同时上传一张视频封面图片的,这里附带一个获取视频封面截图的方法
}

具体方法

**@objc**
func documentPath(subFolder: String?) -> URL {
 let url = URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(
 FileManager.SearchPathDirectory.documentDirectory,
 FileManager.SearchPathDomainMask.userDomainMask, true
 ).first!)
 if(subFolder == **nil**) {
      return url;
 }
 let result = url.appendingPathComponent(subFolder!)
 // 没有文件夹,尝试创建文件夹
 if (!FileManager.default.fileExists(atPath: result.path)) {
 do {
   FileManager.default.createDirectory(at: result, withIntermediateDirectories: true, attributes: nil)
}
  return result

}