iOS : 如何将视频 PHAsset 转换为 NSData
iOS : How to convert a video PHAsset to NSData
我想将存储在我 iPhone 上的视频放到我的 Google 驱动器中。
我已经完成了图像,但是对于视频,这是另一个问题...
对于图像,没问题,我用这种方法将我的资产转换为 NSData :
data = UIImagePNGRepresentation(result!)!
然后我将图像放入我的驱动器!
但是,对于视频,我尝试了很多不同的方法,但不行。
我该怎么办?
非常感谢!
我做到了!
这是解决方案:
PHCachingImageManager().requestAVAssetForVideo(asset, options: nil, resultHandler: {(asset: AVAsset?, audioMix: AVAudioMix?, info: [NSObject : AnyObject]?) in
dispatch_async(dispatch_get_main_queue(), {
let asset = asset as? AVURLAsset
var data = NSData(contentsOfURL: asset.URL)
})
})
之后,您就拥有了一个好的 NSData 变量,您可以使用它来将您的视频上传到云端!
请为我添加 Bellow 解决方案
如果你错过 option.isNetworkAccessAllowed = true 那么你会得到 url
类的错误
private let options: PHVideoRequestOptions = PHVideoRequestOptions()
option.isNetworkAccessAllowed = true
PHImageManager.default().requestAVAsset(-------
更新 Swift 5
这里可以使用PHImageManager
或PHCachingImageManager
PHImageManager.default().requestAVAsset(forVideo: asset,
options: nil) { (asset, audioMix, info) in
if
let asset = asset as? AVURLAsset,
let data = NSData(contentsOf: asset.url) {
//do smth with data
}
}
}
同步获取Image/VideoSwift5+缓存
extension PHAsset {
func getImage() -> UIImage? {
let manager = PHCachingImageManager.default
let option = PHImageRequestOptions()
option.isSynchronous = true
var img: UIImage? = nil
manager().requestImage(for: self, targetSize: CGSize(width: self.pixelWidth, height: self.pixelHeight), contentMode: .aspectFit, options: nil, resultHandler: {(result, info) -> Void in
img = result!
})
return img
}
func getVideo() -> NSData? {
let manager = PHCachingImageManager.default
let option = PHImageRequestOptions()
option.isSynchronous = true
var resultData: NSData? = nil
manager().requestAVAsset(forVideo: self, options: nil) { (asset, audioMix, info) in
if let asset = asset as? AVURLAsset, let data = NSData(contentsOf: asset.url) {
resultData = data
}
}
return resultData
}
}
我想将存储在我 iPhone 上的视频放到我的 Google 驱动器中。 我已经完成了图像,但是对于视频,这是另一个问题...
对于图像,没问题,我用这种方法将我的资产转换为 NSData :
data = UIImagePNGRepresentation(result!)!
然后我将图像放入我的驱动器!
但是,对于视频,我尝试了很多不同的方法,但不行。
我该怎么办?
非常感谢!
我做到了!
这是解决方案:
PHCachingImageManager().requestAVAssetForVideo(asset, options: nil, resultHandler: {(asset: AVAsset?, audioMix: AVAudioMix?, info: [NSObject : AnyObject]?) in
dispatch_async(dispatch_get_main_queue(), {
let asset = asset as? AVURLAsset
var data = NSData(contentsOfURL: asset.URL)
})
})
之后,您就拥有了一个好的 NSData 变量,您可以使用它来将您的视频上传到云端!
请为我添加 Bellow 解决方案
如果你错过 option.isNetworkAccessAllowed = true 那么你会得到 url
类的错误private let options: PHVideoRequestOptions = PHVideoRequestOptions()
option.isNetworkAccessAllowed = true
PHImageManager.default().requestAVAsset(-------
更新 Swift 5
这里可以使用PHImageManager
或PHCachingImageManager
PHImageManager.default().requestAVAsset(forVideo: asset,
options: nil) { (asset, audioMix, info) in
if
let asset = asset as? AVURLAsset,
let data = NSData(contentsOf: asset.url) {
//do smth with data
}
}
}
同步获取Image/VideoSwift5+缓存
extension PHAsset {
func getImage() -> UIImage? {
let manager = PHCachingImageManager.default
let option = PHImageRequestOptions()
option.isSynchronous = true
var img: UIImage? = nil
manager().requestImage(for: self, targetSize: CGSize(width: self.pixelWidth, height: self.pixelHeight), contentMode: .aspectFit, options: nil, resultHandler: {(result, info) -> Void in
img = result!
})
return img
}
func getVideo() -> NSData? {
let manager = PHCachingImageManager.default
let option = PHImageRequestOptions()
option.isSynchronous = true
var resultData: NSData? = nil
manager().requestAVAsset(forVideo: self, options: nil) { (asset, audioMix, info) in
if let asset = asset as? AVURLAsset, let data = NSData(contentsOf: asset.url) {
resultData = data
}
}
return resultData
}
}