Je suis en train d'écrire une application Swift qui envoie une entrée vidéo de caméra iPhone (images) à travers le réseau, afin de pouvoir les afficher plus tard sur une application MacOS.
Actuellement, je saisis des images vidéo à partir d'un AVCaputreSession
, et j'obtiens un à PixelBuffer
partir de la captureOutput
méthode.
Comme chaque image est énorme (pixels RAW), je la CVPixelBuffer
convertis en une CGImage
avec VTCreateCGImageFromCVPixelBuffer
et plus tard en une UIImage
avec compression JPEG (50%). J'envoie ensuite ce JPEG par le réseau et je l'affiche sur l'application Mac OS.
Comme vous pouvez le constater, c'est loin d'être idéal et fonctionne à ~25 FPS sur un iPhone 11. Après quelques recherches, je suis arrivé à l'image GPU 2. Il semble que je pourrais obtenir les données de l'appareil photo et appliquer quelque chose comme ça (de sorte que la transformation se fasse en 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
Et je devrais pouvoir transmettre cette image UII et l'afficher sur l'application macOS. Y a-t-il une meilleure façon de mettre en œuvre tout ce processus ? Je pourrais peut-être utiliser l'encodage matériel H264 de l'iPhone au lieu de convertir les images en JPEG, mais il semble que ce ne soit pas si simple (et il semble que GPUImage fasse quelque chose comme ça d'après ce que j'ai lu).
Toute aide est appréciée, merci d'avance !