Обрезать CMSampleBuffer и обработать его без преобразования в CGImage - PullRequest
0 голосов
/ 20 февраля 2019

Я следовал коду редактора видео в прямом эфире Apple , чтобы получить доступ к редактированию живого видео.

Пока все хорошо, но мне нужен выход, чтобы обрезать буфер сэмплов на 4 части, а затем обработать все четыре с помощью различных фильтров CIF.Например, если размер изображения составляет 1000x1000, я хочу обрезать CMSampleBuffer в 4 изображения размером 250x250, а затем применить уникальный фильтр к каждому, преобразовать его обратно в CMSammpleBuffer и отобразить в Metal View.Вот код, до которого я мог обрезать CMSampleBuffer в CGContext, но не смог преобразовать его обратно в CMSampleBuffer:

let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!

        CVPixelBufferLockBaseAddress(imageBuffer, .readOnly)

        let baseAddress = CVPixelBufferGetBaseAddress(imageBuffer)
        let bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer)
        let cropWidth = 640
        let cropHeight = 640
        let colorSpace = CGColorSpaceCreateDeviceRGB()

        let context = CGContext(data: baseAddress, width: cropWidth, height: cropHeight, bitsPerComponent: 8, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: CGImageAlphaInfo.noneSkipFirst.rawValue | CGBitmapInfo.byteOrder32Little.rawValue)


        CVPixelBufferUnlockBaseAddress(imageBuffer, .readOnly)

        // create image
        let cgImage: CGImage = context!.makeImage()!
        let image = UIImage(cgImage: cgImage)

Мне не нужен CGImage, мне нужен либо CMSampleBuffer, либо CVImageBuffer, чтобы я мог передать егок этой функции func render(pixelBuffer: CVPixelBuffer) -> CVPixelBuffer? класса FilterRenderer, используемого в примере кода этой ссылки от Apple.

...