Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 更改DJIVideoPreviewer的缓冲区格式_Swift_Yuv_Dji Sdk_Uint8t_Cvpixelbuffer - Fatal编程技术网

Swift 更改DJIVideoPreviewer的缓冲区格式

Swift 更改DJIVideoPreviewer的缓冲区格式,swift,yuv,dji-sdk,uint8t,cvpixelbuffer,Swift,Yuv,Dji Sdk,Uint8t,Cvpixelbuffer,现在我正在创建一个应用程序,它使用来自DJI飞机的视频帧,并通过tensorlite目标检测模型运行它 我设法让我的应用程序从飞机上接收帧 但是,框架类型为VPFrameTypeYUV420Planer。我想接收vpframetypeyuv420semiplana的帧。这是因为我想从帧中创建kCVPixelFormatType\u 420YpCbCr8BiPlanarFullRangecvPixelBuffer 我试图更改VideoPreviewWR属性,如下所示 DJIVideoPreview

现在我正在创建一个应用程序,它使用来自DJI飞机的视频帧,并通过tensorlite目标检测模型运行它

我设法让我的应用程序从飞机上接收帧

但是,框架类型为VPFrameTypeYUV420Planer。我想接收
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
    }