2016-02-18 6 views
10

Ich zeige gerade ein Video in meiner App und möchte, dass der Benutzer es in seiner Gerätegalerie/seinem Albumfoto/seiner Kamerarolle speichern kann. Hier ist es, was ich tue, aber das Video ist nicht im Album gespeichert:/Swift - Lade ein Video von entfernter URL herunter und speichere es in einem Fotoalbum

func downloadVideo(videoImageUrl:String) 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
     //All stuff here 

     print("downloadVideo"); 
     let url=NSURL(string: videoImageUrl); 
     let urlData=NSData(contentsOfURL: url!); 

     if((urlData) != nil) 
     { 
      let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]; 

      let fileName = videoImageUrl; //.stringByDeletingPathExtension 

      let filePath="\(documentsPath)/\(fileName)"; 

      //saving is done on main thread 

      dispatch_async(dispatch_get_main_queue(), {() -> Void in 

       urlData?.writeToFile(filePath, atomically: true); 
       print("videoSaved"); 
      }) 

     } 
    }) 

} 

I'va auch in aussehen:

let url:NSURL = NSURL(string: fileURL)!; 

    PHPhotoLibrary.sharedPhotoLibrary().performChanges({ 
     let assetChangeRequest = PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL(url); 
     let assetPlaceHolder = assetChangeRequest!.placeholderForCreatedAsset; 
     let albumChangeRequest = PHAssetCollectionChangeRequest(forAssetCollection: self.assetCollection) 
     albumChangeRequest!.addAssets([assetPlaceHolder!]) 
     }, completionHandler: saveVideoCallBack) 

Aber ich habe den Fehler „kann nicht erstellt Daten aus Datei (null) ". Mein "AssetChangeRequest" ist null. Ich verstehe nicht, wie meine URL gültig ist, und wenn ich mit einem Browser dazu gehe, lade eine schnelle Zeitdatei herunter.

Wenn mir jemand helfen kann, wäre es willkommen! Ich benutze Swift und Targeting iOS 8.0 min.

+1

Wenn Sie eine Datei auf Kamerarolle speichern möchten, einen Blick auf PHPhotoLibrary Klassen nehmen und die Methode 'creationRequestForAssetFromVideoAtFileURL' von' PHAssetChangeRequest' – Nimble

+0

Im Dokument hier: https://developer.apple.com/library/prerelease/ios/documentation/Photos/Reference/PHAssetChangeRequest_Class/index.html#//apple_ref/occ/clm/PHAssetChangeRequest/creationRequestForAssetFromVideoAtFileURL, tue ich nicht verstehe was fileURL ist. –

+0

'fileURL' ist ein Link zu einer Videodatei. Haben Sie versucht, Ihren 'filePath' als' fileURL' zu verwenden? Es kann wie folgt aussehen: 'PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL (NSURL (fileURLWithPath: filePath))' – Nimble

Antwort

21

aktualisiert

Gesucht die Antwort für Swift 3 unter Verwendung von URLSession und herausgefunden zu aktualisieren, dass die Antwort existiert bereits in verwandtem Thema here. Benutze es.

Original-Antwort

Der folgende Code speichert eine Videodatei Camera Roll. Ich habe Ihren Code mit einer kleinen Änderung wieder verwendet - ich habe let fileName = videoImageUrl; entfernt, weil dies zu einem falschen Dateipfad führt.

Ich habe diesen Code getestet und das Asset in der Kamera gespeichert. Sie haben gefragt, was Sie in creationRequestForAssetFromVideoAtFileURL einfügen sollen - fügen Sie einen Link zu der heruntergeladenen Videodatei ein, wie im folgenden Beispiel.

let videoImageUrl = "http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_1mb.mp4" 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
     let url = NSURL(string: videoImageUrl); 
     let urlData = NSData(contentsOfURL: url!); 
     if(urlData != nil) 
     { 
      let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]; 
      let filePath="\(documentsPath)/tempFile.mp4"; 
      dispatch_async(dispatch_get_main_queue(), { 
       urlData?.writeToFile(filePath, atomically: true); 
       PHPhotoLibrary.sharedPhotoLibrary().performChanges({ 
        PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL(NSURL(fileURLWithPath: filePath)) 
       }) { completed, error in 
        if completed { 
         print("Video is saved!") 
        } 
       } 
      }) 
     } 
    }) 
+1

Vielen Dank! Du bist ein Lebensretter :) –

+0

@Nimble hast du irgendeine Idee, dass wir das Video direkt in der Fotobibliothek speichern können, ohne es vorher im Dokumentenordner zu speichern? – Urmi

+0

Sie speichern die Datei im Dokumentenverzeichnis, aber sie wird danach nicht gelöscht (zumindest in diesem Code). Sie sollten auch aufräumen. Wenn Sie automatische Bereinigung wünschen, warum nicht stattdessen im Temp-Verzeichnis speichern? Oder, wenn Sie es manuell möchten, führen Sie die Bereinigung im Abschlussblock durch. – yoninja

10

Swift 3-Version des Codes von @Nimble:

DispatchQueue.global(qos: .background).async { 
    if let url = URL(string: urlString), 
     let urlData = NSData(contentsOf: url) 
    { 
     let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]; 
     let filePath="\(documentsPath)/tempFile.mp4" 
     DispatchQueue.main.async { 
      urlData.write(toFile: filePath, atomically: true) 
      PHPhotoLibrary.shared().performChanges({ 
       PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: URL(fileURLWithPath: filePath)) 
      }) { completed, error in 
       if completed { 
        print("Video is saved!") 
       } 
      } 
     } 
    } 
} 
+0

Haben Sie eine Idee, dass wir das Video direkt in der Fotobibliothek speichern können, ohne es vorher im Dokumentenordner zu speichern? – Urmi

+0

Nicht dass ich mir dessen bewusst bin. Sie sollten die Fotobibliothek als Datenbank betrachten, daher ist das Herunterladen in eine "Datenbank" nicht sinnvoll. –

+0

Okay. aber Sie haben eine Idee, wie viele Daten (GB) wir für eine bestimmte Anwendung speichern können. Genau wie WhatsApp speichert alle Bilder und Videos in Fotobibliothek. Gleichzeitig speichert es sie im Dokumentenordner? \t Ursache Ich entwickle ähnliche Anwendung Download Bilder und Videos von Server und speichern Sie es in Dokumentenordner. – Urmi

Verwandte Themen