Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- func getData(from pixelBuffer: CVPixelBuffer) -> Data {
- //TODO:可以通过CVPixelBufferGetPlaneCount判断一下pixelBuffer是否有两个Plane
- CVPixelBufferLockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: 0))
- let pixelFormatType = CVPixelBufferGetPixelFormatType(pixelBuffer)
- let width = CVPixelBufferGetWidth(pixelBuffer)
- let height = CVPixelBufferGetHeight(pixelBuffer)
- var data = Data()
- let yBaseAddress = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0)
- let yBytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 0)
- let yLength = yBytesPerRow * height
- data.append(Data(bytes: yBaseAddress!, count: yLength))
- let cbcrBaseAddress = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 1)
- let cbcrBytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 1)
- let cbcrLength = cbcrBytesPerRow * height / 2
- data.append(Data(bytes: cbcrBaseAddress!, count: cbcrLength))
- CVPixelBufferUnlockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: 0))
- return data
- }
- func configPixelBufferPool() -> Bool {
- let attributes: [CFString: Any] = [
- kCVPixelBufferPixelFormatTypeKey: pixelFormatType,
- kCVPixelBufferWidthKey: width,
- kCVPixelBufferHeightKey: height,
- kCVPixelBufferBytesPerRowAlignmentKey: yBytesPerRow
- ]
- let status = CVPixelBufferPoolCreate(kCFAllocatorDefault, nil, attributes as CFDictionary, &pixelBufferPool)
- return status == kCVReturnSuccess
- }
- func getPixelBuffer(from data: Data) -> CVPixelBuffer? {
- guard data.count == yLength + cbcrLength,
- let pixelBufferPool = pixelBufferPool else { return nil }
- var _pixelBuffer: CVPixelBuffer?
- //用CVPixelBufferPoolCreatePixelBuffer创建CVPixelBuffer会更快一些
- let status = CVPixelBufferPoolCreatePixelBuffer(nil, pixelBufferPool, &_pixelBuffer)
- guard status == kCVReturnSuccess, let pixelBuffer = _pixelBuffer else {
- print("CVPixelBufferPoolCreatePixelBuffer error")
- return nil
- }
- //把data转换为指针,用指针进行memcpy操作,比用subdata快上百倍
- let srcPtr = data.withUnsafeBytes({ UnsafeRawPointer($0) })
- CVPixelBufferLockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: 0))
- let yBaseAddress = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0)
- memcpy(yBaseAddress, srcPtr, yLength)
- let cbcrBaseAddress = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 1)
- memcpy(cbcrBaseAddress, srcPtr.advanced(by: yLength), cbcrLength)
- CVPixelBufferUnlockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: 0))
- return pixelBuffer
- }
Add Comment
Please, Sign In to add comment