Swift 更改DJIVideoPreviewer的缓冲区格式
现在我正在创建一个应用程序,它使用来自DJI飞机的视频帧,并通过tensorlite目标检测模型运行它 我设法让我的应用程序从飞机上接收帧 但是,框架类型为VPFrameTypeYUV420Planer。我想接收Swift 更改DJIVideoPreviewer的缓冲区格式,swift,yuv,dji-sdk,uint8t,cvpixelbuffer,Swift,Yuv,Dji Sdk,Uint8t,Cvpixelbuffer,现在我正在创建一个应用程序,它使用来自DJI飞机的视频帧,并通过tensorlite目标检测模型运行它 我设法让我的应用程序从飞机上接收帧 但是,框架类型为VPFrameTypeYUV420Planer。我想接收vpframetypeyuv420semiplana的帧。这是因为我想从帧中创建kCVPixelFormatType\u 420YpCbCr8BiPlanarFullRangecvPixelBuffer 我试图更改VideoPreviewWR属性,如下所示 DJIVideoPreview
vpframetypeyuv420semiplana
的帧。这是因为我想从帧中创建kCVPixelFormatType\u 420YpCbCr8BiPlanarFullRange
cvPixelBuffer
我试图更改VideoPreviewWR属性,如下所示
DJIVideoPreviewer.instance()?.frameOutputType = VPFrameTypeYUV420SemiPlaner
然而,我犯了一个错误
我还尝试从YUV420Planer帧创建kCVPixelFormatType\U 420YPCBCCR8BIPLANARFULLRANGE
cvPixelBuffer。然而,我不知道如何将chromaR、chormaB转换为UV
func createPixelBuffer(fromFrame frame: VideoFrameYUV) -> CVPixelBuffer? {
var initialPixelBuffer: CVPixelBuffer?
let _: CVReturn = CVPixelBufferCreate(kCFAllocatorDefault, Int(frame.width), Int(frame.height), kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, nil, &initialPixelBuffer)
guard let pixelBuffer = initialPixelBuffer,
CVPixelBufferLockBaseAddress(pixelBuffer, []) == kCVReturnSuccess
else {
return nil
}
let yPlaneWidth = CVPixelBufferGetWidthOfPlane(pixelBuffer, 0)
let yPlaneHeight = CVPixelBufferGetHeightOfPlane(pixelBuffer, 0)
let uvPlaneWidth = CVPixelBufferGetWidthOfPlane(pixelBuffer, 1)
let uvPlaneHeight = CVPixelBufferGetHeightOfPlane(pixelBuffer, 1)
let yDestination = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0)
memcpy(yDestination, frame.luma, yPlaneWidth * yPlaneHeight)
let uvDestination = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 1)
// let chrB = frame.chromaB.pointee
// let chrR = frame.chromaR.pointee
// I don't know how to convert to uv Buffer.
CVPixelBufferUnlockBaseAddress(pixelBuffer, [])
return pixelBuffer
有解决这个问题的好方法吗?我认为这会奏效:
func createPixelBuffer(fromFrame frame: VideoFrameYUV) -> CVPixelBuffer? {
var initialPixelBuffer: CVPixelBuffer?
let _: CVReturn = CVPixelBufferCreate(kCFAllocatorDefault, Int(frame.width), Int(frame.height), kCVPixelFormatType_420YpCbCr8Planar, nil, &initialPixelBuffer)
guard let pixelBuffer = initialPixelBuffer
, CVPixelBufferLockBaseAddress(pixelBuffer, []) == kCVReturnSuccess
else {
return nil
}
let yPlaneWidth = CVPixelBufferGetWidthOfPlane(pixelBuffer, 0)
let yPlaneHeight = CVPixelBufferGetHeightOfPlane(pixelBuffer, 0)
let uPlaneWidth = CVPixelBufferGetWidthOfPlane(pixelBuffer, 1)
let uPlaneHeight = CVPixelBufferGetHeightOfPlane(pixelBuffer, 1)
let vPlaneWidth = CVPixelBufferGetWidthOfPlane(pixelBuffer, 2)
let vPlaneHeight = CVPixelBufferGetHeightOfPlane(pixelBuffer, 2)
let yDestination = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0)
memcpy(yDestination, frame.luma, yPlaneWidth * yPlaneHeight)
let uDestination = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 1)
memcpy(uDestination, frame.chromaB, uPlaneWidth * uPlaneHeight)
let vDestination = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 2)
memcpy(vDestination, frame.chromaR, vPlaneWidth * vPlaneHeight)
CVPixelBufferUnlockBaseAddress(pixelBuffer, [])
return pixelBuffer
}