Сохранить видео в библиотеке фотографий Swift - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь понять, как сохранить видео в моей библиотеке фотографий. Чтобы начать, я попытался просто выбрать видео с помощью UIImagePickerController и после выбора сохранить его снова в библиотеке с помощью UISaveVideoAtPathToSavedPhotosAlbum. Не имеет особого смысла, но я пытаюсь понять, как работает сохранение видео.

Следующий код не работает, так как он не сохраняет видео:

@IBAction func ChooseVideo(_ sender: Any) {
    let imagePickerController = UIImagePickerController()
    imagePickerController.delegate = self

    imagePickerController.mediaTypes = ["public.movie"]
    self.present(imagePickerController, animated: true, completion: nil)
    }

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

    let videoURL = info[UIImagePickerController.InfoKey.mediaURL] as? URL
    print(UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(videoURL!.path))

    dismiss(animated: true, completion: {
        UISaveVideoAtPathToSavedPhotosAlbum(videoURL!.path, self,  #selector(self.video(_:didFinishSavingWithError:contextInfo:)), nil)
    })
}

Я надеюсь, что вы можете помогите мне, так как я не мог найти много о сохранении видео.

С уважением, МБ

Решение:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])
{
    // *** store the video URL returned by UIImagePickerController *** //
    let videoURL = info[UIImagePickerController.InfoKey.mediaURL] as! URL

    // *** load video data from URL *** //
    let videoData = NSData(contentsOf: videoURL)

    // *** Get documents directory path *** //
    let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0]

    // *** Append video file name *** //

    print(paths)
    let dataPath = paths.appending("/videoFileName.mp4")

    // *** Write video file data to path *** //
    videoData?.write(toFile: dataPath, atomically: false)

    PHPhotoLibrary.shared().performChanges({
        PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: URL(fileURLWithPath: dataPath))
    }) { 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
        }
    }
}

1 Ответ

0 голосов
/ 05 апреля 2020
  • Используйте следующую забаву c, чтобы сохранить видео в каталог документов

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) 
    {
        // *** store the video URL returned by UIImagePickerController *** //
        let videoURL = info[UIImagePickerControllerMediaURL] as! NSURL
    
        // *** load video data from URL *** //
        let videoData = NSData(contentsOfURL: videoURL)
    
        // *** Get documents directory path *** //
        let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0]
    
        // *** Append video file name *** //
        let dataPath = documentsDirectory.stringByAppendingPathComponent("/videoFileName.mp4")
    
        // *** Write video file data to path *** //
        videoData?.writeToFile(dataPath, atomically: false)
    }
    
  • , теперь сохраните это видео в фотография gellary

    PHPhotoLibrary.shared().performChanges({
        PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: Your document directory file)
    }) { 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
        }
    }
    

после этого, если вам не нужно, то удалите изображение из каталога документов, я надеюсь, что оно будет работать для вас ...:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...