菜鸟教程小白 发表于 2022-12-12 19:43:59

ios - 无法从共享扩展 ios 保存视频


                                            <p><p>我创建了一个共享扩展程序,其目的是将视频共享到我的容器应用程序。
作为共享流程的一部分,我想检查用户是否已登录等。
所以我创建了一个应用组,并在容器应用和扩展之间共享数据。(同时使用 NSUserDefaults 和核心数据)</p>

<pre><code> letsharedUserDefaults = NSUserDefaults(suiteName:&#34;group.app.group.name&#34;)
lazy var applicationDocumentsDirectory: NSURL = {
    NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier(&#34;group.app.group.name&#34;)!
}()
</code></pre>

<p>这工作正常。</p>

<p>现在我正在尝试使用 <a href="https://github.com/rs/SDAVAssetExportSession" rel="noreferrer noopener nofollow"><code>SDAVAssetExportSession</code></a> 压缩视频</p>

<pre><code>let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = &#34;yyyy-MM-dd&#39;T&#39;HH-mm-ss&#34;
let timeStamp = NSDate()
let asset = AVAsset(URL: self.shareVideoURL)
let exportSession = SDAVAssetExportSession(asset: asset)
let outputURL = self.applicationDocumentsDirectory.URLByAppendingPathComponent(&#34;\(dateFormatter.stringFromDate(timeStamp)).MP4&#34;)
exportSession.outputURL = outputURL
exportSession.outputFileType = AVFileTypeMPEG4
exportSession.shouldOptimizeForNetworkUse = true

let assetTrack = asset.tracksWithMediaType(AVMediaTypeVideo).first!

let videoWidth:NSNumber = assetTrack.naturalSize.width, videoHeight:NSNumber = assetTrack.naturalSize.height,
let desiredBitrate:NSNumber = 3*1024*1024 , desiredKeyFrameInterval:NSNumber = 20
exportSession.videoSettings = [AVVideoCodecKey:AVVideoCodecH264,
    AVVideoWidthKey:videoWidth,
    AVVideoHeightKey:videoHeight,
    AVVideoCompressionPropertiesKey: [
      AVVideoAverageBitRateKey:desiredBitrate,
      AVVideoMaxKeyFrameIntervalKey:desiredKeyFrameInterval]]

exportSession.audioSettings = [AVFormatIDKey: NSNumber(unsignedInt: kAudioFormatMPEG4AAC),
    AVNumberOfChannelsKey: 2,
    AVSampleRateKey: 44100,
    AVEncoderBitRateKey: 64000]

exportSession.exportAsynchronouslyWithCompletionHandler({
    switch exportSession.status {
    case .Completed:
      print(&#34;Compressed Video size : \(Double(NSData(contentsOfURL: outputURL)!.length)/(1024*1024)) mb&#34;)
    case.Failed:
      print(&#34;Export Failed :\(exportSession.error)&#34;)
    case .Cancelled:
      print(&#34;Export Cancelled :\(exportSession.error)&#34;)
    default:
      print(&#34;complete&#34;)
    }
})         
</code></pre>

<p>当我在共享扩展中执行此操作时,我收到错误:</p>

<pre><code>Error Domain=NSURLErrorDomain Code=-3000 &#34;Cannot create file&#34;
UserInfo={NSLocalizedDescription=Cannot create file, NSUnderlyingError=0x160900450
{Error Domain=NSOSStatusErrorDomain Code=-12149 &#34;(null)&#34;}}
</code></pre>

<p>当我使用文档目录在另一个应用程序中运行此代码时,它可以正常工作,没有任何问题,但是当我开始使用应用程序组容器时,它不允许保存文件。</p>

<p>谁能指出正确的方向,将压缩文件保存在共享应用组容器中</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我找不到 AVAssetExportSession 的解决方案并开始直接使用 AVAssetWriter,然后也通过 <a href="https://github.com/rs/SDAVAssetExportSession" rel="noreferrer noopener nofollow">SDAVAssetExportSession</a> </p>

<p>而且看起来很有效,它可以保存视频。
因此,请检查您保存到的那个 URL 对应于 <a href="https://forums.developer.apple.com/message/77495#77495" rel="noreferrer noopener nofollow">this.</a> </p>

<p>我重写了从链接到 Objective-C 的 Swift 代码</p>

<pre><code>NSURL *groupPath = [ containerURLForSecurityApplicationGroupIdentifier: @&#34;group.**.***&#34;];
groupPath = ;
groupPath = ;
</code></pre>

<p><em>在 <a href="https://stackoverflow.com/users/1702943/rao" rel="noreferrer noopener nofollow">Rao&#39;s</a> 之后添加的代码评论</em> </p>

<p>希望你能解决这个问题,让我更新。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 无法从共享扩展 ios 保存视频,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/37026547/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/37026547/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 无法从共享扩展 ios 保存视频