extension CVPixelBuffer { func copy() -> CVPixelBuffer { precondition(CFGetTypeID(self) == CVPixelBufferGetTypeID(), "copy() cannot be called on a non-CVPixelBuffer") var _copy : CVPixelBuffer? // var BytesAlignment:Int = 4 // let CFBytesAlignment = CFNumberCreate(kCFAllocatorDefault, .intType, &BytesAlignment)! let attribute:[String:Any] = [kCVPixelBufferMetalCompatibilityKey as String:kCFBooleanTrue] // kCVPixelBufferBytesPerRowAlignmentKey as String:CFBytesAlignment CVPixelBufferCreate( kCFAllocatorDefault, CVPixelBufferGetWidth(self), CVPixelBufferGetHeight(self), CVPixelBufferGetPixelFormatType(self), attribute as CFDictionary, &_copy) guard let copy = _copy else { fatalError() } CVPixelBufferLockBaseAddress(self, CVPixelBufferLockFlags.readOnly) CVPixelBufferLockBaseAddress(copy, CVPixelBufferLockFlags(rawValue: 0)) for plane in 0..<CVPixelBufferGetPlaneCount(self) { let dest = CVPixelBufferGetBaseAddressOfPlane(copy, plane) let source = CVPixelBufferGetBaseAddressOfPlane(self, plane) let height = CVPixelBufferGetHeightOfPlane(self, plane) let bytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(self, plane) let bytesPerRowDst = CVPixelBufferGetBytesPerRowOfPlane(copy, plane) for h in 0..<height { memcpy(dest?.advanced(by:h*bytesPerRowDst), source?.advanced(by:h*bytesPerRow), bytesPerRow) } } CVPixelBufferUnlockBaseAddress(copy, CVPixelBufferLockFlags(rawValue: 0)) CVPixelBufferUnlockBaseAddress(self, CVPixelBufferLockFlags.readOnly) return copy } }
https://stackoverflow.com/questions/38335365/pulling-data-from-a-cmsamplebuffer-in-order-to-create-a-deep-copy
http://blog.csdn.net/fernandowei/article/details/52180840