Swift 3 将数据转换为 AVAsset 或 PHAsset

标签 swift nsdata photosframework avkit

我需要将 Data 对象转换为 AVAsset。

有一次我需要在 Realm 中将视频保存为数据对象。为了保存它,我将 AVAsset 转换为数据。现在我需要将其转换回来并将视频保存到 cameraRoll。

也许你可以针对这个问题提出一些其他的解决方案?)

下面是我如何将 AVAsset 转换为数据:

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 }
                  }
   })
}

最佳答案

您不能将 Data 对象直接转换为 PHAsset。但是您可以将数据写入本地 url,然后从 url 创建 Assets 。

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)
        }
    }
}

关于Swift 3 将数据转换为 AVAsset 或 PHAsset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44620160/

相关文章:

swift - 如何计算 DFT 中每个 bin 的能量?

ios - 将 UIImage 转换为 NSData 并将 NSData 转换为 NSString 以将图像发布到服务器

ios - 在 PhotoKit 中,修改 PHAsset 会留下原始内容。如何?可否决?

ios8 - 如何使用 Photos API 在 iOS 8.0 中检索照片扩展名 (jpg/png)?

ios - 从 UIImagePickerController 获取图像位置

swift - 是否可以中止 Swift 集合上的映射函数?

ios - 如何在Swift中为每个UUID生成随机但唯一的颜色?

ios - 快速解析来自rest api的xml数据

ios - 将存储为 NSdata 的图像放入 pickerView 时发生错误

objective-c - 使用 Objective-C 读取 .mobileprovisioning 配置文件