Streaming Cam pc vers iPad
Adrenaline
Membre
Bonjour,
voilà je viens de débuter dans la prog osx.
J'ai un projet d'application qui consiste à récupérer les images d'une caméra branché à un pc(ou un mac) et de les envoyer par wifi à un ipad, ou on pourrait voir les images en streaming.
Sachant que je dois faire du temps réel, j'ai déjà regardé un peu du coté de vnc pour l'accès à distance du pc par l'ipad.
Sauf que là je suis bloquée. Toutes les appli type VNC "partage" le bureau. Quelqu'un aurait-il des pistes?
voilà je viens de débuter dans la prog osx.
J'ai un projet d'application qui consiste à récupérer les images d'une caméra branché à un pc(ou un mac) et de les envoyer par wifi à un ipad, ou on pourrait voir les images en streaming.
Sachant que je dois faire du temps réel, j'ai déjà regardé un peu du coté de vnc pour l'accès à distance du pc par l'ipad.
Sauf que là je suis bloquée. Toutes les appli type VNC "partage" le bureau. Quelqu'un aurait-il des pistes?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Il faut t'orienter sur tout ce qui est streaming plutôt. Il y a un Programming Guide pour ça.
PS : Attention, j'ai pas testé AirPlay encore (qui est arrivé avec iOS4.2) mais je me demande si ça n'intègre pas déjà ce cas que tu veux faire (selon peut-être la caméra utilisée et si tu as un soft sur l'ordi qui sait streamer en AirPlay).
en fait je me suis penchée sur VNC parce que j'ai besoin de tracker ce que l'utilisateur fait sur la video de l'ipad vers le pc.
j'ai vu l'application iCam qui fait un peu ce que je voudrais(du moins pour le coté vidéo). Mais je sais pas comment m'y prendre pour faire la même chose
VNC n'est pas un protocole. C'est une solution d'accès à un bureau distant qui se base sur le protocole RFB Remote Frame Buffer. On peut l'utiliser pour envoyer des images, mais dans le cas d'une vidéo, ce n'est pas super judicieux.
le problème c'est que c'est pas fluide du tout
Dans tous les cas VNC n'est pas vraiment le plus adapté car lui est plutôt fait pour le contrôle à distance d'un écran. Si toi tu ne veux que la vidéo, et n'autoriser que certaines interactions, regarde du côté des protocoles de streaming plutôt. Et lis le Streaming Programming Guide for iOS qui indique les choses à respecter pour faire du streaming à un device mobile comme l'iPad (formats supportés, trucs acceptables pour laisser au proc du device le temps de décoder le flux vidéo, ...)
j'ai fait une appli serveur coté PC et une appli client coté iPad. ça communique correctement.
le seul problème c'est pour l'envoie des données images.
j'envoie les données brutes coté PC (sous forme d'un tableau de BYTE), mais côté iPad, je sais pas comment faire pour afficher une image dans une UIImageView à partir de ces données.
La représentation de l'image encodée TIFF ? ou PNG ? ou JPEG ?
La représentation RAW (pixel par pixel) ? Si oui par couches ou entrelacé ? RGBA32, ARGB32, RGB24, indexé ? Avec un padding (stride) en fin de chaque ligne ?
Si tu comptes "faire du streaming" en envoyant tes images les unes à la suite des autres, sans aucune compression de tes images, y'a intérêt à avoir un bon débit et une bonne bande passante (même pour du Wifi en local)... et s'il n'y a aucun signal de synchronisation, tu risques d'avoir un flux sautant aussi...
Habituellement les protocoles de streaming prévoient une compression à la fois spaciale (genre FFT = Huffman sur les macroblocs, comme pour MPEG4 ou même MJPEG) et temporelle (comme pour MPEG4 aussi, sans compression temporelle cela revient à envoyer les frames complètes à chaque fois, comme si tu avais un GOP de 1 et envoyais des frames "I" pour toutes les frames au lieu d'utiliser les P et les et un flux de contrôle... et c'est pas pour rien.
Pourquoi ne pas utiliser un serveur de streaming du côté PC, c'est fait pour ça non ?
parce que pour l'instant je ne sais pas comment faire. je débute réellement
pour le moment j'ai une appli coté pc qui se contente d'envoyer une image sous forme d'un tableau de pixels.
Pour répondre à ta question pour reconstruire une UIImage à partir d'un tableau d'octets, tu as plusieurs solutions, mais la plus simple étant de passer par CoreGraphics et un CGBitmapContext.
Avec CGBitmapContextCreate(...) tu peux créer un context graphique de type bitmap (ce qui est ton cas vu que tu fais du pixel par pixel) en précisant toutes les caractéristiques du buffer et sa représentation (nombre de plans, nombre de bits par pixels, nombre de pixels par ligne, nombre de lignes, nombre de plans, nombre de couleurs, espace colorimétrique utilisé, stride, ...) pour que cela colle avec le format des pixels que tu envoies.
Maintenant si côté PC tu peux générer plutôt une représentation JPEG de ton image, non seulement ça te permettra d'effectuer une compression spaciale de l'image en choisissant un coefficient de compression acceptable pour trouver un compromis entre quantité d'octets et qualité, mais en plus cela te permettra de regénérer une UIImage à partir de la représentaiton JPEG de façon encore plus simple sur l'iPad, avec un simple [tt][UIImage imageWithData:tonNSDataRepresentantTesOctetsRecus][/tt]
(Bon et sinon pour la compression sur l'axe temporel, donc entre les images successives, c'est une autre paire de manches par contre)
j'ai l'habitude de faire du traitement d'images à partir de carte d'acquisition, de caméras, etc...
là le soucis c'est que je veux faire du traitement d'images sur un iPad.
l'idée est d'avoir une appli coté PC qui s'occupe de la carte d'acquisition, et qui envoie les images aux iPad clients.
pour le moment j'ai essayer ça : (avec imageBuffer mon tableau de pixels)
mais ça marche pas
Quelqu'un aurait une idée pour améliorer ça?
Pour un serveur streaming coté PC, je ne sais pas du tout comment m'y prendre, pour un fichier video je vois un peu près la démarche, mais pour un flux de données, comment faire?
j'arirve à afficher l'image dans l'UIImageView du simulator, mais pas dans l'iPad lui même
Quand à l'image que tu as dans le simulateur et pas dans l'iPad ce n'est pas étonnant non plus, puisque les ressources d'un device mobile (smartphone comme un iPhone ou autre, tablette comme un iPad ou autre, ...) sont toujours plus limitées que les ressources d'un PC de bureau (ton Mac... et à fortiori le simulateur qui tourne dessus).
Là où dans le simulateur (qui utilise la RAM du Mac) tu n'es pas limité (enfin si, limité par la mémoire du Mac, mais qui en a bcp + que l'iPad et qui en plus peut utiliser la mémoire virtuelle quand il est en manque de RAM donc bon t'as de la marge sur le simu), sur le device faut prendre en compte les aspects mémoire.
C'est aussi pour cela que je t'ai prévenu dès le début que tu risquais d'avoir de nombreuses embuches à ton projet surtout vu l'orientation que tu lui donnes (envoyer tes images non compressées ni spacialement ni temporellement par le réseau plutôt que de faire du vrai streaming d'un flux compressé).
On ne programme pas sur iOS (comme sur tout device mobile) de la même manière que l'on code pour PC ou Mac, les contraintes (mémoire&proc) d'un device mobile jouent un rôle bien plus primordial dans le développement, il faut penser le code en conséquence (si c'est une petite appli qui présente des données "de base" et avec une simple navigation on voit pas vraiment la différence, mais si c'est une appli de traitement d'image et à fortiori de suite d'images dans le but de faire une pseudo-vidéo, les contraintes mémoires sont bien plus à prendre en compte !)
C'est pas que je veuille te décourager, mais franchement, pour un premier projet et premier développement sur l'iPad tu as choisi le pompon côté contraintes tecniques. Même moi qui ai l'expérience du dev iOS et qui ai fait une formation incluant des notions sur le traitement d'image et la vidéo, ce genre de projet j'y réfléchirai à deux fois avant de m'y atteler. Et la première chose que j'aurais en considération seraient les aspects compression, puissance du proc, bande passante, performances et surtout surtout optimisation mémoire...
Et là je suis prêt à parier qu'avec ta technique tu exploses l'empreinte mémoire de ton appli, ce qui fait que même si tu arrivais à afficher des images sur l'iPad, soit ça serait au détriment du framerate, soit plus certainement ça ne tiendrais pas longtemps (surtout si tu n'as pas équilibré au plus près tes retain/release et créé des AutoreleasePools de proximité dans tes boucles) car explosera au bout de quelques images... non ? (suffit de vérifier avec Instruments après tout)
C'est pour cela que je te répète qu'envoyer image par image et en plus des images non compressées spacialement ni temporellement c'est une mauvaise idée et une mauvaise piste pour mener à bien ton projet, à tous les coups avec un système de ce type tu vas dans le mur (ou au mieux ça marche mais tu as un framerate de 2 ou 3... secondes par image)
Orientes-toi tout de suite vers le streaming (du vrai, pas du pseudo streaming recréé par tes soins sans compression), en suivant les guides sur le Video Streaming d'Apple ([url=http://HTTP Live Streaming Programming Guide]http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/StreamingMediaGuide/Introduction/Introduction.html[/url], etc, etc)
coté PC je vois pour faire du streaming (serveur et client ça marche) mais côté iPad comme client je suis toujours perdue.
je vois pas comment s'utilise le mediastreamsegmenter sur mac
j'ai fait le test avec un avi.
coté pc, ça prend l'avi ça l'encode pour que ça soit compatible avec apple, ça met tous sur le serveur et coté apple plus qu'à récupérer l'url.
Mais maintenant pour le streaming, le vrai?
(dsl :P )
http://developer.apple.com/library/ios/#samplecode/MoviePlayer_iPhone/Introduction/Intro.html
pour afficher la vidéo dans un uiview (et pas dans safari) mais ça marche pas
je sais tjrs pas quelle piste prendre, j'ai beau relire les doc sur le http live streaming je suis toujours perdue
help