2016-05-04 11 views
2

Ich habe eine Freigabe-Erweiterung erstellt, deren Zweck es ist, Videos mit meiner Container-App zu teilen. Als Teil des Share-Flusses möchte ich überprüfen, ob Benutzer angemeldet ist usw. Also habe ich eine App-Gruppe erstellt und die Daten zwischen der Container-App und der Erweiterung (mit NSUserDefaults und Core Data)Nicht in der Lage, Video von der Freigabe-Erweiterung zu speichern ios

let sharedUserDefaults = NSUserDefaults(suiteName:"group.app.group.name") 
lazy var applicationDocumentsDirectory: NSURL = { 
    NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.app.group.name")! 
}() 

Das funktioniert gut.

Jetzt, da ich das Video zu komprimieren versuchen 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") 
    } 
})   

Verwendung Wenn ich dies ausführen in Aktien-Erweiterung ich die Störung erhalte:

Error Domain=NSURLErrorDomain Code=-3000 "Cannot create file" 
UserInfo={NSLocalizedDescription=Cannot create file, NSUnderlyingError=0x160900450 
{Error Domain=NSOSStatusErrorDomain Code=-12149 "(null)"}} 

Wenn ich diesen Code ausführen in Eine andere App, die das Dokumentenverzeichnis verwendet, funktioniert ohne Probleme, aber wenn ich den App-Gruppencontainer benutze, kann die Datei nicht gespeichert werden.

Kann jemand mich in der richtigen Richtung weist die komprimierte Datei in den gemeinsamen genutzten App Gruppencontainern

Antwort

2

ich eine Lösung für AVAssetExportSession finden konnte, nicht zu sparen und begann AVAssetWriter direkt zu verwenden, dann auch über SDAVAssetExportSession

Und scheint wie es funktioniert, es spart Video. Also, bitte überprüfen, dass URL zu speichern ist entsprechend this.

i umschrieb Swift-Code von Link zu Objective-C

NSURL *groupPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier: @"group.**.***"]; 
groupPath = [groupPath URLByAppendingPathComponent: @"Library" isDirectory: YES]; 
groupPath = [groupPath URLByAppendingPathComponent:@"Caches" isDirectory: YES]; 

Code hinzugefügt, nachdem Rao's Kommentar

Sie Hoffnung Löse das, halte mich auf dem Laufenden.

0

Apps und Erweiterungen sind nicht berechtigt, in den freigegebenen Container selbst zu schreiben, aber sie haben die Berechtigung zum Schreiben in "Library/Caches" innerhalb dieses freigegebenen Containers.

Als Referenz: https://forums.developer.apple.com/thread/45736