无法保存来自共享扩展的视频 ios
Not able to save video from share-extension ios
我创建了一个共享扩展程序,其目的是将视频共享到我的容器应用程序。
作为共享流程的一部分,我想检查用户是否登录等。
所以我创建了一个应用程序组并在容器应用程序和扩展之间共享数据。(同时使用 NSUserDefaults 和核心数据)
let sharedUserDefaults = NSUserDefaults(suiteName:"group.app.group.name")
lazy var applicationDocumentsDirectory: NSURL = {
NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.app.group.name")!
}()
这工作正常。
现在我正在尝试使用 SDAVAssetExportSession
压缩视频
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH-mm-ss"
let timeStamp = NSDate()
let asset = AVAsset(URL: self.shareVideoURL)
let exportSession = SDAVAssetExportSession(asset: asset)
let outputURL = self.applicationDocumentsDirectory.URLByAppendingPathComponent("\(dateFormatter.stringFromDate(timeStamp)).MP4")
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("Compressed Video size : \(Double(NSData(contentsOfURL: outputURL)!.length)/(1024*1024)) mb")
case .Failed:
print("Export Failed :\(exportSession.error)")
case .Cancelled:
print("Export Cancelled :\(exportSession.error)")
default:
print("complete")
}
})
当我在共享扩展中执行此操作时出现错误:
Error Domain=NSURLErrorDomain Code=-3000 "Cannot create file"
UserInfo={NSLocalizedDescription=Cannot create file, NSUnderlyingError=0x160900450
{Error Domain=NSOSStatusErrorDomain Code=-12149 "(null)"}}
当我 运行 在另一个使用文档目录的应用程序中使用此代码时,它工作正常,没有任何问题,但是当我开始使用应用程序组容器时,它不允许保存文件。
任何人都可以指出正确的方向以将压缩文件保存在共享应用程序组容器中
找不到AVAssetExportSession的解决方案,开始直接用AVAssetWriter,然后也通过SDAVAssetExportSession
而且看起来很有效,它可以保存视频。
因此,请检查您要保存到的 URL 是否对应于 this.
我将 Swift 代码从 link 重写为 Objective-C
NSURL *groupPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier: @"group.**.***"];
groupPath = [groupPath URLByAppendingPathComponent: @"Library" isDirectory: YES];
groupPath = [groupPath URLByAppendingPathComponent:@"Caches" isDirectory: YES];
在Rao's评论后添加的代码
希望你能解决这个问题,让我知道最新消息。
应用程序和扩展程序没有写入共享容器本身的权限,但它们有权写入该共享容器内的 "Library/Caches"。
我创建了一个共享扩展程序,其目的是将视频共享到我的容器应用程序。 作为共享流程的一部分,我想检查用户是否登录等。 所以我创建了一个应用程序组并在容器应用程序和扩展之间共享数据。(同时使用 NSUserDefaults 和核心数据)
let sharedUserDefaults = NSUserDefaults(suiteName:"group.app.group.name")
lazy var applicationDocumentsDirectory: NSURL = {
NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.app.group.name")!
}()
这工作正常。
现在我正在尝试使用 SDAVAssetExportSession
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH-mm-ss"
let timeStamp = NSDate()
let asset = AVAsset(URL: self.shareVideoURL)
let exportSession = SDAVAssetExportSession(asset: asset)
let outputURL = self.applicationDocumentsDirectory.URLByAppendingPathComponent("\(dateFormatter.stringFromDate(timeStamp)).MP4")
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("Compressed Video size : \(Double(NSData(contentsOfURL: outputURL)!.length)/(1024*1024)) mb")
case .Failed:
print("Export Failed :\(exportSession.error)")
case .Cancelled:
print("Export Cancelled :\(exportSession.error)")
default:
print("complete")
}
})
当我在共享扩展中执行此操作时出现错误:
Error Domain=NSURLErrorDomain Code=-3000 "Cannot create file"
UserInfo={NSLocalizedDescription=Cannot create file, NSUnderlyingError=0x160900450
{Error Domain=NSOSStatusErrorDomain Code=-12149 "(null)"}}
当我 运行 在另一个使用文档目录的应用程序中使用此代码时,它工作正常,没有任何问题,但是当我开始使用应用程序组容器时,它不允许保存文件。
任何人都可以指出正确的方向以将压缩文件保存在共享应用程序组容器中
找不到AVAssetExportSession的解决方案,开始直接用AVAssetWriter,然后也通过SDAVAssetExportSession
而且看起来很有效,它可以保存视频。 因此,请检查您要保存到的 URL 是否对应于 this.
我将 Swift 代码从 link 重写为 Objective-C
NSURL *groupPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier: @"group.**.***"];
groupPath = [groupPath URLByAppendingPathComponent: @"Library" isDirectory: YES];
groupPath = [groupPath URLByAppendingPathComponent:@"Caches" isDirectory: YES];
在Rao's评论后添加的代码
希望你能解决这个问题,让我知道最新消息。
应用程序和扩展程序没有写入共享容器本身的权限,但它们有权写入该共享容器内的 "Library/Caches"。