2017-12-06 3 views
0

Ich erhalte die URL (Datei: ///var/mobile/Media/DCIM/100APPLE/IMG_0840.MOV) von PHAsset-Objekt und bin in der Lage, das Video wiederzugeben Gut auf dem Gerät. Wenn es jedoch Zeit ist, den Firebase-Speicher hochzuladen/zu packen, bekomme ich meinen completionHandler nicht einmal zurück.Firebase-Speicher für IOS wird nicht hochgeladen .MOV von Kamera Roll

//requesting url from asset 
    PHImageManager.default().requestAVAsset(forVideo: asset, options: options, resultHandler: { (videoAsset, audioMix, info) in 

      if let assetURL = videoAsset as? AVURLAsset { 

       let url = assetURL.url 

       //upload from url 
      let storageRef = Storage.storage().reference().child("videos").child("\(memory.ID!)") 
      let uploadMetaData = StorageMetadata() 
      uploadMetaData.contentType = "video/quicktime" 
       self.storageRef.putFile(from: url, metadata: uploadMetaData) { (metaData, error) in 

       if error != nil { 
        print(error!.localizedDescription) 
       } 
      } 

Wenn ich eine .mp4 Datei von AVFoundation Capture mit einer lokalen URL wie diese Hochladen (file: /// var/mobile/Behälter/Daten/Anwendung/209BB017-13C7-4432-AFE4- EC3A13469900/Dokumente/ff49bbc9ac794ed28d6f25944f128933.mp4), es funktioniert gut.

Ich habe auch versucht, eine .MOV-Datei auf der Firebase Storage-Konsole hochzuladen, und das funktioniert auch.

Dank

Antwort

1

Manchmal PHAssets gibt uns nicht mit einem URLAsset müssen wir so überprüfen, ob das angegebene Inventar ein AVURLAsset ist und wenn nicht müssen wir diesen Vermögenswert in unserem Dokumenten-Verzeichnis speichern und dann die URL aus Dokumenten Verzeichnis erhalten.

func uploadVideoToFirebase(content: PHAsset) { 
    let options = PHVideoRequestOptions() 
    options.isNetworkAccessAllowed = true 
    PHImageManager.default().requestAVAsset(forVideo: content, options: options) { (asset, mix, args) in 
     if let asset = asset as? AVURLAsset { 
      let url = asset.url 
      // URL OF THE VIDEO IS GOT HERE 
     } else { 
      guard let asset = asset else {return} 
      self.startAnimating(message: "Processing.") 
      self.saveVideoInDocumentsDirectory(withAsset: asset, completion: { (url, error) in 
       if let error = error { 
        print(error.localizedDescription) 
       } 
       if let url = url { 
        // SAVED IN DOCUMENTS DIRECTORY AND URL IS GOT HERE 
       } 
      }) 
     } 
    } 
} 

Speicher in Dokumenten-Verzeichnis: nach erfolgreichem Upload oder deaktivieren Sie es beim nächsten Start der App

func saveVideoInDocumentsDirectory(withAsset asset: AVAsset, completion: @escaping (_ url: URL?,_ error: Error?) -> Void) { 
    let manager = FileManager.default 
    guard let documentDirectory = try? manager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) else {return} 
    var outputURL = documentDirectory.appendingPathComponent("output") 
    do { 
     try manager.createDirectory(at: outputURL, withIntermediateDirectories: true, attributes: nil) 
     let name = NSUUID().uuidString 
     outputURL = outputURL.appendingPathComponent("\(name).mp4") 
    }catch let error { 
     print(error.localizedDescription) 
    } 
    //Remove existing file 
    _ = try? manager.removeItem(at: outputURL) 
    guard let exportSession = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetMediumQuality) else {return} 
    exportSession.outputURL = outputURL 
    exportSession.outputFileType = AVFileTypeMPEG4 
    exportSession.exportAsynchronously { 
     switch exportSession.status { 
     case .completed: 
      print("exported at \(outputURL)") 
      completion(outputURL, exportSession.error) 
     case .failed: 
      print("failed \(exportSession.error?.localizedDescription ?? "")") 
      completion(nil, exportSession.error) 
     case .cancelled: 
      print("cancelled \(exportSession.error?.localizedDescription ?? "")") 
      completion(nil, exportSession.error) 
     default: break 
     } 
    } 
} 

Wir haben dieses unerwünschtes Video zu löschen. Ich habe es bei der nächsten App Launch mit dieser Methode gelöscht.

func clearDocumentsDirectory() { 
    let manager = FileManager.default 
    guard let documentDirectory = try? manager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) else {return} 
    let outputURL = documentDirectory.appendingPathComponent("output") 
    //Remove existing file 
    _ = try? manager.removeItem(at: outputURL) 
} 

Hoffe, das hilft.

Verwandte Themen