先了解一下什么是AVAssetExportPresetPassthrough
//将使所有轨道的媒体完全按照存储在源资源中的方式传递到output,除了通道无法通过的轨道,通常是由于指定的outputFileType指示的容器格式的约束。
此选项不包含在-allExportPresets和-exportPresetsCompatibleWithAsset返回的数组中。
public let AVAssetExportPresetPassthrough: String
1,使用AVAssetExportSession导出方式:
如非必要,presetName使用AVAssetExportPresetPassthrough即可,这个name不会进行其他的操作,例如转码,我测试的时候,当选择的name为AVAssetExportPresetHighestQuality、视频为两分钟的时候,导出大约需要30s左右。当选择AVAssetExportPresetPassthrough时,大约7、8s。相差还是很大的。
2 只是单纯的拷贝视频导沙盒中
这这个需求其实并不需要AVAssetExportSession来导出。经过上面的测试,一个两分钟的视频在保证质量的情况下最快也要7、8s。这个显然是不够快的,因为我们不需要裁剪或转码等其他需求。这个时候可以先把视频转成data数据,在把data写入沙盒文件中,两分钟的视频大约也就1s左右。
let fileUrl = createVideoFilePath(fileName: "videoCache")
do {
let data = try Data(contentsOf: “相册视频路径”)
do {
try data.write(to: fileUrl)
// 其他操作(上传等)
} catch {}
} catch {}
func createVideoFilePath(fileName: String) -> URL {
// 设置视频保存地址
let documentDirectory = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first! + "/\(fileName)"
if !FileManager.default.fileExists(atPath: documentDirectory) {
do {
try FileManager.default.createDirectory(atPath: documentDirectory, withIntermediateDirectories: true)
} catch let error {
logDebug("\(error)")
}
}
let filePath: String = "\(documentDirectory)/\((Date().timeIntervalSince1970*100).int).mp4"
let fileUrl: URL = URL(fileURLWithPath: filePath)
return fileUrl
}