Estou escrevendo um aplicativo Swift que envia uma entrada de vídeo da câmera do iPhone (frames) através da rede, para que eu possa exibi-los posteriormente em um aplicativo macOS.
Atualmente, estou capturando quadros de vídeo de um AVCaputreSession
, e obtenho um PixelBuffer
do captureOutput
método.
Como cada quadro é enorme (pixels RAW), estou convertendo CVPixelBuffer
isso em um CGImage
com VTCreateCGImageFromCVPixelBuffer
e depois em um UIImage
com compressão JPEG (50%). Em seguida, envio esse JPEG pela rede e o exibo no aplicativo Mac OS.
Como você pode ver, isso está longe de ser o ideal e roda a ~25 FPS em um iPhone 11. Depois de alguma pesquisa, eu vim com a Imagem 2 da GPU. Parece que eu consegui obter os dados da câmera e aplicar algo assim (para que a transformação seja feita na GPU):
camera = try Camera(sessionPreset:AVCaptureSessionPreset640x480)
let pictureOutput = PictureOutput()
pictureOutput.encodedImageFormat = .JPEG
pictureOutput.imageAvailableCallback = {image in
// Send the picture through the network here
}
camera --> pictureOutput
E eu devo ser capaz de transmitir essa imagem e exibi-la no aplicativo macOS. Existe uma maneira melhor de implementar todo este processo? Talvez eu pudesse usar a codificação de hardware H264 do iPhone em vez de converter imagens para JPEG, mas parece que não é tão simples assim (e parece que a GPUImage faz algo assim pelo que eu li).
Qualquer ajuda é apreciada, obrigado de antemão!