解决视频导入到沙盒中速度慢的问题

1,705 阅读1分钟

先了解一下什么是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  
}