菜鸟教程小白 发表于 2022-12-12 20:07:43

ios - 共享扩展中的 AVAssetExportSession


                                            <p><p>我正在尝试在共享扩展中选择的视频上使用 AVAssetExportSession 并获取</p>

<blockquote>
<p>Error Domain=NSURLErrorDomain Code=-3000 &#34;Cannot create file&#34;
UserInfo={NSLocalizedDescription=Cannot create file,
NSUnderlyingError=0x14811fdb0 {Error Domain=NSOSStatusErrorDomain
Code=-12124 &#34;(null)&#34;}}</p>
</blockquote>

<p>但是我可以在同一个 NSURL 上手动创建文件而不会出错。这是我正在使用的功能</p>

<pre><code>func reencodeVideo() {
    let videoAsset = AVURLAsset(URL: video.url)

    let videoTrack = videoAsset.tracksWithMediaType(AVMediaTypeVideo) as AVAssetTrack
    print(videoTrack.estimatedDataRate)
    let exportSession = AVAssetExportSession(asset: videoAsset, presetName: AVAssetExportPreset1920x1080)
    guard let outputURL = uploadableFileURL else {
      return
    }
    let fileManager = NSFileManager.defaultManager()
    // let created = fileManager.createFileAtPath(outputURL.path!, contents: nil, attributes: nil)
    if let path = outputURL.path where fileManager.fileExistsAtPath(path) {
      print(&#34;file exists&#34;)
    }
    do {
      try fileManager.removeItemAtURL(outputURL)
      print(&#34;deleted&#34;)
    } catch {
      print(error)
    }
    exportSession?.outputURL = outputURL
    exportSession?.outputFileType = AVFileTypeQuickTimeMovie

    exportSession?.exportAsynchronouslyWithCompletionHandler{
      print(exportSession?.status)
    }
}

private var uploadableFileURL: NSURL? {
    guard let tempFileName = video.url.lastPathComponent else {
      return nil
    }
    let fileManager = NSFileManager.defaultManager()
    guard let containerURL = fileManager.containerURLForSecurityApplicationGroupIdentifier(Constants.appGroupIdentifier) else {
      return nil
    }
    return containerURL.URLByAppendingPathComponent(&#34;videoFile.mov&#34;)
}
</code></pre>

<p>我已在同一目录中成功创建文件,但 AVAssetExportSession 在那里返回错误。
任何想法我做错了什么?</p>

<p>我尝试使用 <code>AVAssetReader</code> 和 <code>AVAssetWriter</code>,而 <code>AVAssetWriter</code> 在尝试启动时返回相同的错误。如果我使用 Documents 目录,则编码过程成功完成,并且仅在使用共享应用程序组容器时失败。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您的问题可能与使用文档文件夹和 icloud 同步有关。
见 <a href="https://forums.developer.apple.com/message/77495#77495" rel="noreferrer noopener nofollow">https://forums.developer.apple.com/message/77495#77495</a> </p>

<p>如果你这样做:</p>

<pre><code>guard let containerURL = fileManager.containerURLForSecurityApplicationGroupIdentifier(Constants.appGroupIdentifier) else {
      return nil
}

let libraryURL = containerURL.URLByAppendingPathComponent(&#34;Library&#34;, isDirectory: true)
let cachesURL = libraryURL.URLByAppendingPathComponent(&#34;Caches&#34;, isDirectory: true)
return cachesURL.URLByAppendingPathComponent(&#34;videoFile.mov&#34;)
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 共享扩展中的 AVAssetExportSession,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/37427804/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/37427804/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 共享扩展中的 AVAssetExportSession