Quelles techniques sont les meilleures pour diffuser des données de camera video iPhone à un ordinateur?

Je voudrais diffuser de la video depuis un appareil photo iPhone vers une application fonctionnant sur un Mac. Pensez un peu comme un chat video, mais d'une seule façon, de l'appareil à une application de récepteur (et ce n'est pas un chat video).

Ma compréhension de base jusqu'à présent:

  1. Vous pouvez utiliser AVFoundation pour get des données de camera video «en direct» sans save dans un file, mais ce sont des données non compressées et je devrais donc gérer la compression moi-même.
  2. Il n'y a pas de support AVCaptureOutput embedded pour l'envoi vers un location réseau, je devrais travailler un peu seul.

Ai-je raison à propos de ce qui précède ou suis-je déjà hors piste?

Apple Tech Q & A 1702 fournit quelques informations sur la sauvegarde des images individuelles en tant qu'images – est-ce la meilleure façon de procéder? Juste sauver 30fps et ensuite quelque chose comme ffmpeg pour les compresser?

Il y a beaucoup de discussions sur la diffusion en direct sur l'iPhone, mais beaucoup less sur les personnes qui envoient des videos en direct. J'espère que de grands traits me feront pointer dans la bonne direction.

Cela dépend beaucoup de la résolution de votre cible et du type de performance que vous ciblez.

D'un sharepoint vue abstrait, j'aurais probablement un thread de capture pour remplir un buffer directement à partir de AVCaptureOutput, et un thread de communication pour envoyer et réinitialiser le buffer (rembobiné si nécessaire) à un hôte spécifié toutes les x millisecondes.

Après avoir effectué le transfert de données initial, j'obtiendrais 15fps à la résolution la plus basse et je travaillerais jusqu'à ce que le buffer déborde avant que le thread de communication puisse transmettre ce qui nécessiterait une résolution d'image, une taille de buffer (probablement dépendante du GSM, et bientôt être des tailles d'images CDMA), et enfin la vitesse maximale à laquelle vous pouvez transmettre ce tampon.

Vous pouvez utiliser AVCaptureVideoDataOutput et un sampleBufferDelegate pour capturer des trames brutes compressées, il vous suffit ensuite de les diffuser sur le réseau. AVFoundation fournit une API pour encoder les trames en files video locaux, mais n'en fournit aucune pour le streaming sur le réseau. Votre meilleur pari est de find une bibliothèque qui diffuse des images brutes sur le réseau. Je commencerais par ffmpeg; Je crois que libavformat supporte RTSP, regardez le code ffserver.

Notez que vous devez configurer AVCaptureVideoDataOutput pour get des images compressées, afin d'éviter de devoir compresser des images video brutes sans bénéficier de l'enencoding matériel.