Я создаю приложение для сканирования камеры, которое будет использовать внешний 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. Спасибо