功能: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
}