如何在 Swift 中将 ALAsset 转换为 NSData?

How to convert ALAsset to NSData in Swift?

我尝试在以下代码中将 ALAsset 转换为 NSData:

        let assetUrl = NSURL(string: self.filename!)

        ALAssetsLibrary().assetForURL(assetUrl,
            resultBlock: { asset in
                let rep = asset.defaultRepresentation()

                var buffer: UInt8 = UInt8()
                var error: NSError?

                let from: Int64 = 0

                let length: Int = Int(rep.size())
                var buffered = rep.getBytes(&buffer, fromOffset: from, length: length, error: &error)

                let data = NSData(bytesNoCopy: &buffered, length: length, freeWhenDone: true)

                self.video = data
            }, // # 1
            failureBlock: { error in
                println("ReportPhoto::loadVideoFromAssetsLibrary() - Error while loading saved video from AssetsLibrary!")
            }
        )

但我在控制台中收到以下错误消息(在代码中的 #1):

object 0x27d02ce8: pointer being freed was not allocated

我跟踪了错误中提到的对象并找到了,但我不知道问题是什么以及如何解决!

该对象是 NSData 对象中的一个 属性,名为 _bytes

你的代码有两个问题:

  • rep.getBytes() 将字节写入现有缓冲区,该缓冲区必须具有 已分配所需的大小。您创建的缓冲区 var buffer: UInt8 = UInt8() 大小为零。
  • (正如@Lame 在评论中所说的那样:)rep.getBytes() 的 return 值 是写入缓冲区的字节数,而不是指向数据的指针。

最简单的方法是创建具有所需大小的 NSMutableData 对象 并将其可变数据指针传递给 rep.getBytes()

var error: NSError?
let length = Int(rep.size())
let from = Int64(0)
let data = NSMutableData(length: length)!
let numRead = rep.getBytes(UnsafeMutablePointer(data.mutableBytes), fromOffset: from, length: length, error: &error)

另请注意,ALAssetsLibrary 框架已从 iOS 9 开始弃用。 如果您的最低部署目标是 iOS 8 或更高版本,那么您可以实现相同的目标 来自照片框架的 PHAssetPHImageManager

let fetchResult = PHAsset.fetchAssetsWithALAssetURLs([assetUrl!], options: nil)
if let phAsset = fetchResult.firstObject as? PHAsset {
    PHImageManager.defaultManager().requestImageDataForAsset(phAsset, options: nil) {
        (imageData, dataURI, orientation, info) -> Void in
        // ...
    }
}