簡體   English   中英

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 變量,你可以用它把你的視頻放到雲端!

請添加波紋管解決方案對我有用

如果你錯過 option.isNetworkAccessAllowed = true 那么你會得到 url 屬的錯誤

private let options: PHVideoRequestOptions = PHVideoRequestOptions()

option.isNetworkAccessAllowed = true 

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

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

同步獲取圖像/視頻 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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM