Как создать буфер для вывода видеозахвата в swift - PullRequest
0 голосов
/ 05 января 2019

Я создаю приложение для сканирования камеры, которое будет использовать внешний SDK для декодирования и обработки кадров изображения для ожидаемого вывода. SDK предоставляет API для чтения кадров видеовыхода и имеет параметр с ТИПОМ buffer: UnsafeMutablePointer<BYTES> для фактического выполнения декодирования.

Итак, я хочу преобразовать вывод видеокадра в UnsafeMutablePointer<UInt8>

Я следовал этому уроку https://medium.com/ios-os-x-development/ios-camera-frames-extraction-d2c0f80ed05a, чтобы получить AVCaptureVideoDataOutputSampleBufferDelegate работающий

Я пытался преобразовать imageData в байт, но он не работает.

Примечание: у меня есть пример кода из SDK в Objective C ниже, но я не смог преобразовать его в быстрый, потому что я не знаю Objective C

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {

    guard let pixelBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
        return
    }

    let width: Int = CVPixelBufferGetWidth(pixelBuffer)
    let height = CVPixelBufferGetHeight(pixelBuffer)

    let ciImage = CIImage(cvPixelBuffer: pixelBuffer)

    guard let cgImage = context.createCGImage(ciImage, from: ciImage.extent) else {
        return
    }

    guard var imageData = UIImage(cgImage: cgImage).jpegData(compressionQuality: 1.0) else{
        return
    }
    print("Width : \(width) & Height: \(height)")
    print(imageData.count)

    imageData.withUnsafeMutableBytes({(bytes: UnsafeMutablePointer<UInt8>) -> Void in
        // Get Bytes Here
    })

    // I have tried bello code too - not working
    /* let mem = UnsafeMutablePointer<UInt8>.allocate(capacity: imageData.count)
       _  = imageData.copyBytes(to: UnsafeMutableBufferPointer(start: mem, count: 1))

       let imageByte = mem.move()
       mem.deallocate()

       let imageByte = [UInt8](imageData) */

}

Ниже приведен пример кода Objective C, который работает с SDK, который я использую

uint8_t *buffer;

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{ // got an image
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
size_t width    = CVPixelBufferGetWidth      (pixelBuffer);
size_t height   = CVPixelBufferGetHeight     (pixelBuffer);
size_t pitch    = CVPixelBufferGetBytesPerRow(pixelBuffer);
uint8_t *source = (uint8_t *) CVPixelBufferGetBaseAddress(pixelBuffer);
if (buffer == NULL)
{
    buffer = (uint8_t *) malloc(width * height);
}
for (int y = 0; y < height; y++)
{
    for (int x = 0; x < width; x++)
    {
        int sum;
        sum  =  77 * *source++;
        sum += 151 * *source++;
        sum +=  28 * *source++;
        *buffer++ = sum >> 8;
        source++;
    }
    source += pitch - 4 * width;
}
buffer -= width * height;
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);

// This works I can use the buffer now in the SDK

}

СПАСИБО, заранее

Итак, я ожидаю, что смогу получить буфер изображения в UnsafeMutablePointer. Спасибо

...