菜鸟教程小白 发表于 2022-12-13 15:29:02

ios - 在后台运行 AVAssetExportSession


                                            <p><p>当应用程序在后台时,我无法让 AVAssetExportSession 工作。</p>

<p>我的应用程序启用了后台模式“后台获取”。</p>

<p>当这个 UIApplicationDelegate 方法被调用时</p>

<pre><code>func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -&gt; Void)
</code></pre>

<p>被称为我使用 AVAssetExportSession 导出一个 AVAsset,使用方法:</p>

<p>exportAsynchronouslyWithCompletionHandler</p>

<p>然后我收到此错误:</p>

<pre><code>Error Domain=AVFoundationErrorDomain Code=-11800 &#34;The operation could not be completed&#34; UserInfo={NSUnderlyingError=0x147dae560 {Error Domain=NSOSStatusErrorDomain Code=-16980 &#34;(null)&#34;}, NSLocalizedFailureReason=An unknown error occurred (-16980), NSLocalizedDescription=The operation could not be completed}
</code></pre>

<p>但是,当我有背景模式“音频、Airplay 和画中画”时,导出工作正常。</p>

<p>这很好,但是我们的提交被拒绝了,因为我们没有在后台播放任何音频。</p>

<p>还有其他方法可以在后台导出视频吗?</p>

<p>干杯,红</p>

<p>复制步骤
我创建了一个示例项目来展示这个问题。</p>

<p>下载地址:<a href="http://up.red.to/WKo1MMstzD" rel="noreferrer noopener nofollow">http://up.red.to/WKo1MMstzD</a> </p>

<ul>
<li>在设备上运行应用</li>
<li>接受权限</li>
<li>按下主页按钮</li>
<li>在 Xcode 中,转到调试 -> 模拟后台刷新</li>
<li>查看错误(在控制台中打印并显示为本地通知)</li>
</ul></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>你的问题:</p>

<blockquote>
<p>is there any other way to export video in the background?</p>
</blockquote>

<p>当然,有一些限制。</p>

<p><code>NSProcessInfo</code> 有一组 API,用于在应用程序处于后台时请求更多时间来完成任务。例如:</p>

<pre><code>id activity = [ beginActivityWithOptions:NSActivityAutomaticTerminationDisabled reason:@&#34;Good Reason&#34;];
[exportSession exportAsynchronouslyWithCompletionHandler:^{
    [ endActivity:activity];
}];
</code></pre>

<p>这会让你有更多的时间。还有其他用于同步操作的 API,在任何一种情况下,您的应用程序仍应为系统做好准备,以<em>不</em>允许更多时间。这在 WWDC 2015 的 session 中得到了广泛的介绍。</p>

<p>您还必须确保您的后台事件没有写入文件系统的 protected 部分。确保输出位置具有正确的 <code>NSFileProtection</code> 属性设置,即使设备被锁定也允许访问。</p>

<p>现在,特别是使用后台获取,您完成工作并调用后台获取完成处理程序的时间非常有限。后台获取 API 旨在与 <code>NSURLSession</code> 一起使用,以安排在您的应用程序进程之外执行的后台下载。使用 <code>NSProcessInfo</code> API 可能不会为您赢得更多时间,而且后台获取 API 非常不适合编码/导出媒体。即使是很小的媒体文件,完成所需的时间也会超过后台提取处理程序的时间限制。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在后台运行 AVAssetExportSession,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/36185277/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/36185277/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在后台运行 AVAssetExportSession