我在真实设备中的 ios 13.3 中遇到了同样的问题,它在 ios 13.2 模拟器中工作,但给出了以下错误。



这是我想将 .mov 文件转换为 mp4 的代码。

class func encodeVideo(at videoURL: String, completionHandler: ((URL?, Error?) -> Void)?)  {
    let avAsset = AVURLAsset(url: URL.init(fileURLWithPath: videoURL), options: nil)

    let startDate = Date()

    //Create Export session
    guard let exportSession = AVAssetExportSession(asset: avAsset, presetName: AVAssetExportPresetPassthrough) else {
        completionHandler?(nil, nil)
        return
    }

    //Creating temp path to save the converted video
    let filename = "Video_\(Date().timeIntervalSince1970).mp4"
      // Below Folder Path used tor getting directory path
    let strfilePath = (FolderPath.temporaryDirectory.getDirectoryPath as NSString).appendingPathComponent(filename)
    let filePath = URL.init(fileURLWithPath: strfilePath)

    //Check if the file already exists then remove the previous file
    if FileManager.default.fileExists(atPath: filePath.path) {
        do {
            try FileManager.default.removeItem(at: filePath)
        } catch {
            completionHandler?(nil, error)
        }
    }

    exportSession.outputURL = filePath
    exportSession.outputFileType = AVFileType.mp4
    exportSession.shouldOptimizeForNetworkUse = true
    let start = CMTimeMakeWithSeconds(0.0, preferredTimescale: 0)
    let range = CMTimeRangeMake(start: start, duration: avAsset.duration)
    exportSession.timeRange = range

    exportSession.exportAsynchronously(completionHandler: {() -> Void in
        switch exportSession.status {
        case .failed:
            print(exportSession.error ?? "NO ERROR")
            completionHandler?(nil, exportSession.error)
        case .cancelled:
            print("Export canceled")
            completionHandler?(nil, nil)
        case .completed:
            //Video conversion finished
            let endDate = Date()

            let time = endDate.timeIntervalSince(startDate)
            print(time)
            print("Successful!")
            print(exportSession.outputURL ?? "NO OUTPUT URL")
            completionHandler?(exportSession.outputURL, nil)

            default: break
        }

    })
}

最佳答案

let strfilePath = (FolderPath.temporaryDirectory.getDirectoryPath as NSString).appendingPathComponent(filename)

您不能直接存储在该文件夹中,但您需要将文件存储在子文件夹中,例如像这样:
let documentDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! as NSURL

let strfilePath = documentDirectoryURL.appendingPathComponent("Subfolder/filename.mp4") as URL

此外,您可以阅读此 article

关于swift - AVAssetExportSession 给我 AVFoundationErrorDomain Code=-11800,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59339411/

10-14 13:41