Kirill Averyanov
Kirill Averyanov

Reputation: 41

Swift 3 Convert Data to AVAsset or PHAsset

I need to convert Data object to AVAsset.

Once I needed to save a video in Realm as Data object. To save it, I converted AVAsset to Data. Now I need to convert it back and save a video to cameraRoll.

Maybe you can suggest some other solutions for this problem?)

Here is how I converted AVAsset to Data:

func convert(phAsset: PHAsset, completion: @escaping (_ data: Data?) -> Void) { 
 PHCachingImageManager().requestAVAsset(forVideo: phAsset,
                options: nil,
                resultHandler: { asset, _, _ in
                  guard let asset = asset else { return }

                  let exportSession = AVAssetExportSession(asset: asset,
                                           presetName: AVAssetExportPresetHighestQuality)
                  let fileUrl: URL
                  guard let url = asset as? AVURLAsset else { return }
                  fileUrl = url.url

                  exportSession?.outputURL = fileUrl
                  exportSession?.outputFileType = AVFileTypeQuickTimeMovie
                  var data = Data()

                  exportSession?.exportAsynchronously {
                    do {
                      data = try Data(contentsOf: fileUrl)
                      completion(data)
                    } catch { return }
                  }
   })
}

Upvotes: 1

Views: 3847

Answers (1)

Quang Nguyen
Quang Nguyen

Reputation: 21

You cannot convert Data object to PHAsset directly. But you can write data to local url and then create Asset from the url.

Swift 3:

func writeImage_VideoToLibrary(data: Data, fileDescription: String) {

    let date = Date()
    self.createDirectory(name: "MyDataApp")
    // write data to library camera roll
    PHPhotoLibrary.shared().performChanges({
        if fileDescription.contains("VIDEO") {
            // write video
            let url = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("MyDataApp/video_\(date).mov")
            try? data.write(to: url)
            PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: url)
        } else {
            //write image
            let url = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("MyDataApp/img_\(date).jpeg")
            try? data.write(to: url)
            PHAssetChangeRequest.creationRequestForAssetFromImage(atFileURL: url)
        }
        print(fileDescription)
    }) { saved, err in
        if err != nil {
            print(err.debugDescription)
        }
    }
}

Upvotes: 1

Related Questions