Ios AVAssetExportSession不在设备上工作,但在模拟器上工作(AVFoundationErrorDomain代码=-11800,未知错误代码-12780)

Ios AVAssetExportSession不在设备上工作,但在模拟器上工作(AVFoundationErrorDomain代码=-11800,未知错误代码-12780),ios,avfoundation,avassetexportsession,Ios,Avfoundation,Avassetexportsession,编辑:为了让任何有兴趣检查此问题的人都能更轻松地处理问题,我在中添加了一个演示项目 问题 我见过几个问题都有相同的错误,但没有一个解决方案对我有帮助。我想试试我的运气 我正在尝试按原样导出视频,主要是为了了解AVFoundation和AVAssetExportSession。我的导出在模拟器上运行得非常好,但在我尝试过的任何iOS设备上都不起作用(即,一台iPhone X和一台iPhone XR分别运行iOS 12)。我主要遵循此链接上的Ray Wenderleich教程来执行视频导出: 如果您

编辑:为了让任何有兴趣检查此问题的人都能更轻松地处理问题,我在中添加了一个演示项目

问题

我见过几个问题都有相同的错误,但没有一个解决方案对我有帮助。我想试试我的运气

我正在尝试按原样导出视频,主要是为了了解AVFoundation和AVAssetExportSession。我的导出在模拟器上运行得非常好,但在我尝试过的任何iOS设备上都不起作用(即,一台iPhone X和一台iPhone XR分别运行iOS 12)。我主要遵循此链接上的Ray Wenderleich教程来执行视频导出:

如果您能在这个话题上提供帮助,我将不胜感激。我的代码如下:

正在检索我添加到名为Demo.mp4的应用程序包中的视频的URL:

@objc func export() {
    let urlString = Bundle.main.path(forResource: "Demo", ofType: ".mp4")!
    let url = URL(fileURLWithPath: urlString)
    ExportManager.shared.exportWithAVFoundation(url:url) { (outputUrl, errorString) in
        if let outputUrl = outputUrl {
            self.playVideo(url: outputUrl)
        } else if let errorString = errorString {
            print("ERROR: \(errorString)")
        }
    }
}
我在ExportManager中的导出功能如下(对不起,太长了)

我试着做的一些事情是在作文中添加一首有声曲目(我以前没有包括这首歌)。虽然没有帮助它在实际设备上工作,但至少我导出的视频现在有了音频

我还尝试将预设质量更改为Passthrough,而不是最高质量,因为我从其他线程中了解到这可能会有所帮助,但没有效果

编辑

添加了createPath函数:

func createPath() -> URL {
    let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
    let documentDirectory = paths.first!
    let myPathDocs = documentDirectory.appending("FinalVideo.mov")
    let url = URL(fileURLWithPath: myPathDocs)

    if FileManager.default.fileExists(atPath: myPathDocs) {
        try? FileManager.default.removeItem(atPath: myPathDocs)
    }

    return url
}
注:
createPath()只在目录中创建一个有效路径,用于保存导出的视频。如果导出之前该路径上存在文件,则会将其删除

问题是您将字符串附加到另一个字符串,导致文件路径错误,如file:///var/mobile/Containers/Data/Application//DocumentsFinalVideo.mov

您应该改用appendingPathComponent()

func createPath()->URL{
让path=NSSearchPathForDirectoriesInDomains(.documentDirectory、.userDomainMask,true)
让documentDirectory=URL(fileURLWithPath:paths.first!)
让url=documentDirectory.appendingPathComponent(“FinalVideo.mov”)
如果FileManager.default.fileExists(atPath:url.path){
try?FileManager.default.removietem(位于:url)
}
返回url
}

您必须使用默认方法:
appendingPathComponent()

请同时共享您的createPath()代码。@PavelKozlov完成。我还将我的代码添加到一个github存储库中,该存储库链接在我文章的开头,以使其更易于复制。我检查了从您的函数和我的函数生成的URL,我不敢相信这个问题如此微不足道,它还可以与appending(“/FinalVideo.mov”)一起使用。非常感谢你。我用我的时间试图找出出口代码的问题,我甚至不认为这个问题将是路径。也许你能得到的最简单的赏金是hahaI,我还不明白为什么它在模拟器上工作,而不是在设备上。在模拟器上,它最终将其保存在与名为DocumentsFinalVideo.mov的Documents文件夹相同的级别。这是有道理的,我不允许保存在这里的一个设备,但标准应该反映在工作模拟器。
func createPath() -> URL {
    let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
    let documentDirectory = paths.first!
    let myPathDocs = documentDirectory.appending("FinalVideo.mov")
    let url = URL(fileURLWithPath: myPathDocs)

    if FileManager.default.fileExists(atPath: myPathDocs) {
        try? FileManager.default.removeItem(atPath: myPathDocs)
    }

    return url
}