webentwicklung-frage-antwort-db.com.de

Speichern Sie das Video in der Galerie und erhalten Sie den Pfad für das in der Galerie gespeicherte Video

Ich möchte ein aus UIImagePickerController ausgewähltes Video im Fotoalbum speichern. Danach muss ich die URL zum gespeicherten Pfad abrufen. Ich habe einige bereits existierende Fragen gesehen, die mit ALAssetsLibrary antworten, das jetzt veraltet ist. Wie: Video in der Galerie speichern und Pfad zum Video speichern

Kann mir jemand bitte helfen, Photo's framework zu verwenden und das oben genannte gewünschte Ergebnis zu erzielen. Bitte korrigieren Sie mich, wenn ich irgendwo falsch liege.

Vielen Dank!!

5

Das hat für mich perfekt funktioniert. 

Swift 3.1 ->

PHPhotoLibrary.shared().performChanges({
            PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: url!)
}) { saved, error in
            if saved {
                let fetchOptions = PHFetchOptions()
                fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]

                // After uploading we fetch the PHAsset for most recent video and then get its current location url

                let fetchResult = PHAsset.fetchAssets(with: .video, options: fetchOptions).lastObject 
                PHImageManager().requestAVAsset(forVideo: fetchResult!, options: nil, resultHandler: { (avurlAsset, audioMix, dict) in
                    let newObj = avurlAsset as! AVURLAsset
                    print(newObj.url) 
                    // This is the URL we need now to access the video from gallery directly.
                    })
            }
}
13

Zunächst müssen Sie die folgende Berechtigung in der Plist-Datei Ihrer App festlegen:

Datenschutz - Beschreibung der Fotobibliothek

Geben Sie eine Zeichenfolge an, die dem Benutzer angezeigt wird und erläutert, warum Sie die Berechtigung anfordern.

Nächster, 

import photos

Verwenden Sie dann diesen Code, um Videos zu speichern

    PHPhotoLibrary.shared().performChanges({
        PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: fileURL)
    }) { saved, error in
        if saved {
            let fetchOptions = PHFetchOptions()
            fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

            let fetchResult = PHAsset.fetchAssets(with: .video, options: fetchOptions).firstObject
            // fetchResult is your latest video PHAsset
            // To fetch latest image  replace .video with .image
        }
    }

Um URLs von PHAsset zu erhalten, beziehen Sie sich auf diese Antwort die Antwort der Frage

5
Surjeet

Wenn Sie das gespeicherte Element abrufen möchten (keine Sortierungsbeschreibung mit Datumsreihenfolge verwenden), können Sie dies folgendermaßen tun:

var changeRequest: PHAssetChangeRequest?
var blockPlaceholder: PHObjectPlaceholder?

PHPhotoLibrary.shared().performChanges({
            changeRequest = PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: url!)
            blockPlaceholder = changeRequest?.placeholderForCreatedAsset
}) { saved, error in
            if saved {
                guard let placeholder = blockPlaceholder else {
                    return
                }
                let fetchOptions = PHFetchOptions()
                let fetchResult:PHFetchResult = PHAsset.fetchAssets(withLocalIdentifiers: [placeholder.localIdentifier], options: fetchOptions)
                if let asset = fetchResult.firstObject {
                    //here you have the PHAsset
                } 
            }
}
2
Bisca

Versuchen Sie es so!

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]){
if mediaType.isEqualToString(kUTTypeMovie as NSString as String) || mediaType.isEqualToString(kUTTypeVideo as NSString as String){
    let videoPath = info[UIImagePickerControllerMediaURL] as! NSURL // Path of video Url
    PHPhotoLibrary.sharedPhotoLibrary().performChanges({
    let createAssetRequest = PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL(videoPath)
    let assetPlaceholder = createAssetRequest?.placeholderForCreatedAsset
    let albumChangeRequest = PHAssetCollectionChangeRequest(forAssetCollection: self.assetCollection, assets: self.photosAsset)
            albumChangeRequest!.addAssets([assetPlaceholder!])
       }, completionHandler: { (success, error) in
                    NSLog("Adding video to Library ->%@", (success ? "Success" : "Error"))
                    picker.dismissViewControllerAnimated(true, completion: nil)
            })
      }
}
1
Bhupat Bheda

Ich mache dies, indem ich eine Erweiterung der URL-Klasse erstelle

extension URL {

    func saveVideo( success:@escaping (Bool,URL?)->()){


        URLSession.shared.downloadTask(with: URLRequest(url: self)) { (url, response, error) in

            let mgr = FileManager.default

            let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]


            let destination = URL(fileURLWithPath: String(format: "%@/%@", documentsPath, "video.mp4"))


            try? mgr.moveItem(atPath: /url?.path, toPath: /destination.path)

            PHPhotoLibrary.shared().performChanges({
                PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: destination)
            }) { completed, error in
                if completed {
                    print("Video is saved!")
                    success(true,destination)
                }
                if error != nil{
                    success(false,nil)
                }
            }
        }.resume()
    }
}

wenn Sie speichern und spielen möchten, können Sie dies in ViewController als verwenden 

guard let urlToDownload = URL(string: videoURLStringToDownload) else { return }

  urlToDownload.saveVideo(success: { (isSaved,url) in           
    guard let videoURL = url, isSaved else { return }

        let player = AVPlayer(url: videoURL)
          let playerViewController = AVPlayerViewController()
           playerViewController.player = player
          self.present(playerViewController, animated: true) {
                            playerViewController.player?.play()
          }
    })

import AVKit zum Abspielen von Videos über AVPlayerViewController

import Photos und PhotosUI zum Speichern von Videos mit PHAsset.

Ich hoffe es hilft!

1
Agent Smith