Guest User

Untitled

a guest
Jul 17th, 2018
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.60 KB | None | 0 0
  1. func getData(from pixelBuffer: CVPixelBuffer) -> Data {
  2. //TODO:可以通过CVPixelBufferGetPlaneCount判断一下pixelBuffer是否有两个Plane
  3.  
  4. CVPixelBufferLockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: 0))
  5.  
  6. let pixelFormatType = CVPixelBufferGetPixelFormatType(pixelBuffer)
  7. let width = CVPixelBufferGetWidth(pixelBuffer)
  8. let height = CVPixelBufferGetHeight(pixelBuffer)
  9.  
  10. var data = Data()
  11. let yBaseAddress = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0)
  12. let yBytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 0)
  13. let yLength = yBytesPerRow * height
  14. data.append(Data(bytes: yBaseAddress!, count: yLength))
  15.  
  16. let cbcrBaseAddress = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 1)
  17. let cbcrBytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 1)
  18. let cbcrLength = cbcrBytesPerRow * height / 2
  19. data.append(Data(bytes: cbcrBaseAddress!, count: cbcrLength))
  20.  
  21. CVPixelBufferUnlockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: 0))
  22.  
  23. return data
  24. }
  25.  
  26. func configPixelBufferPool() -> Bool {
  27. let attributes: [CFString: Any] = [
  28. kCVPixelBufferPixelFormatTypeKey: pixelFormatType,
  29. kCVPixelBufferWidthKey: width,
  30. kCVPixelBufferHeightKey: height,
  31. kCVPixelBufferBytesPerRowAlignmentKey: yBytesPerRow
  32. ]
  33. let status = CVPixelBufferPoolCreate(kCFAllocatorDefault, nil, attributes as CFDictionary, &pixelBufferPool)
  34. return status == kCVReturnSuccess
  35. }
  36.  
  37. func getPixelBuffer(from data: Data) -> CVPixelBuffer? {
  38. guard data.count == yLength + cbcrLength,
  39. let pixelBufferPool = pixelBufferPool else { return nil }
  40.  
  41. var _pixelBuffer: CVPixelBuffer?
  42. //用CVPixelBufferPoolCreatePixelBuffer创建CVPixelBuffer会更快一些
  43. let status = CVPixelBufferPoolCreatePixelBuffer(nil, pixelBufferPool, &_pixelBuffer)
  44. guard status == kCVReturnSuccess, let pixelBuffer = _pixelBuffer else {
  45. print("CVPixelBufferPoolCreatePixelBuffer error")
  46. return nil
  47. }
  48.  
  49. //把data转换为指针,用指针进行memcpy操作,比用subdata快上百倍
  50. let srcPtr = data.withUnsafeBytes({ UnsafeRawPointer($0) })
  51.  
  52. CVPixelBufferLockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: 0))
  53. let yBaseAddress = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0)
  54. memcpy(yBaseAddress, srcPtr, yLength)
  55. let cbcrBaseAddress = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 1)
  56. memcpy(cbcrBaseAddress, srcPtr.advanced(by: yLength), cbcrLength)
  57. CVPixelBufferUnlockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: 0))
  58.  
  59. return pixelBuffer
  60. }
Add Comment
Please, Sign In to add comment