iOS:如何将视频PHAsset转换为NSData

11
我希望将存储在我的iPhone上的视频放到我的Google Drive中。对于图像,我已经完成了,但是对于视频,情况有些不同... 对于图像,没有问题,我使用以下方法将我的资源转换为NSData:
   data = UIImagePNGRepresentation(result!)!

我把这张图片放到了我的云盘上!

但是对于视频,我尝试了许多不同的方法,但都不行。

我该怎么办?

非常感谢!


文件的格式是什么(.mp4)?请查看相关问题中的答案,并告诉我是否有所帮助。 - Michael Dautermann
我不知道,但它是存储在我的iPhone上的视频,这些视频是我用iPhone相机创建的,可能是.mov格式。 - testa abalez
4个回答

25

我做到了!

这是解决方法:

    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变量,您可以使用它将您的视频上传到云中!


它不起作用。正确的解决方案是如何使用PHAsset从文件获取NSData - Xingxing

1

更新至 Swift 5

可以使用PHImageManagerPHCachingImageManager

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

1

请添加以下解决方案,它对我有用

如果您遗漏了 option.isNetworkAccessAllowed = true,则会在生成 URL 时出现错误。

private let options: PHVideoRequestOptions = PHVideoRequestOptions()

option.isNetworkAccessAllowed = true 

PHImageManager.default().requestAVAsset(-------

谢谢伙计,你救了我的命。 - Mr Abbasi

0

同步获取图像/视频 Swift 5 + 缓存

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接