Envoyer rapidement des images vidéo compressées en utilisant GPUImage

voix
1

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 à PixelBufferpartir de la captureOutputméthode. Comme chaque image est énorme (pixels RAW), je la CVPixelBufferconvertis en une CGImageavec VTCreateCGImageFromCVPixelBufferet plus tard en une UIImageavec 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 !

Créé 18/05/2020 à 18:35
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

Je comprends que vous vouliez faire cette opération dans un environnement non Internet.

Quelles sont les contraintes de votre projet ;

  1. Fps minimum ?
  2. Une résolution vidéo minimale ?
  3. Le son doit-il être transmis ?
  4. Quel est votre environnement réseau ?
  5. Version minimale d'iOS et d'OSX ?

En dehors de cela, GPUImage n'est pas une solution adaptée pour vous. Si vous voulez transférer des vidéos, vous devez encoder H264 ou H265 (HEVC) à chaque instant. De cette manière, vous pouvez transmettre la vidéo de manière performante.

La solution que vous utilisez actuellement est CMSampleBuffer-> CVPixelBuffer-> JPEG-> La conversion des données charge sérieusement le processeur. Elle augmente également le risque de fuite de mémoire.

Si vous pouvez en dire un peu plus, j'aimerais vous aider. J'ai de l'expérience dans le domaine du traitement vidéo.

Désolé pour mon anglais.

Créé 24/05/2020 à 23:59
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more