Изменить формат буфера DJIVideoPreviewer - PullRequest
0 голосов
/ 15 октября 2019

Сейчас я создаю приложение, которое использует видеокадр с самолета DJI и запускаю его через модель обнаружения тензорных объектов.

Мне удалось получить мое приложение для получения кадра с самолета.

Однако тип фрейма - VPFrameTypeYUV420Planer. Я хочу получить кадр VPFrameTypeYUV420SemiPlanar. Это потому, что я хочу создать kCVPixelFormatType_420YpCbCr8BiPlanarFullRange cvPixelBuffer из фрейма.

Я попытался изменить свойство videopreviewr следующим образом.

DJIVideoPreviewer.instance()?.frameOutputType = VPFrameTypeYUV420SemiPlaner

Однако я получил ошибку.

Я также пытался создать kCVPixelFormatType_420YpCbCr8BiPlanarFullRange cvPixelBuffer из кадра YUV420Planer. Однако я не знаю, как конвертировать 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

Есть ли хороший способ решить эту проблему?

...