我需要将 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/