Streaming Cam pc vers iPad

AdrenalineAdrenaline Membre
02:16 modifié dans Vos applications #1
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?

Réponses

  • AliGatorAliGator Membre, Modérateur
    02:16 modifié #2
    C'est pas VNC qu'il faut utiliser, VNC est un protocole de partage d'écran (et de capture de la souris et du clavier, etc), pas de streaming video.
    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).
  • iSofTomiSofTom Membre
    02:16 modifié #3
    Le problème avec AirPlay c'est qu'on n'a la main sur rien du tout, à  moins de ne passer par des méthodes cachées... (ce qui est le mal!)
  • AdrenalineAdrenaline Membre
    02:16 modifié #4
    Merci de me répondre  :)

    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
  • BunoBuno Membre
    02:16 modifié #5
    Yo,
    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.
  • AdrenalineAdrenaline Membre
    02:16 modifié #6
    après ce n'est pas une simple webcam que j'utilise sur le pc, je suis novice, alors je me suis dit que la vidéo c'est une suite d'images, du coup pourquoi pas les récupérer et les envoyer par VNC sur l'iPad.

    le problème c'est que c'est pas fluide du tout  :(
  • AdrenalineAdrenaline Membre
    02:16 modifié #7
    Donc si j'ai bien compris le mieux c'est d'utiliser les NSStream pour la gestion des flux?
  • AliGatorAliGator Membre, Modérateur
    02:16 modifié #8
    dans 1290781191:

    après ce n'est pas une simple webcam que j'utilise sur le pc, je suis novice, alors je me suis dit que la vidéo c'est une suite d'images, du coup pourquoi pas les récupérer et les envoyer par VNC sur l'iPad.

    le problème c'est que c'est pas fluide du tout  :(
    Si seulement une vidéo n'était qu'une suite d'image... En général c'est un peu plus que ça : c'est encapsulé dans un stream, et surtout c'est compressé (plus ou moins selon si tu nécessites du temps réel ou pas et donc suivant le temps auquel le processeur a le droit pour encoder la vidéo et pour que ça soit transmis plus vite par wifi) avec des frames I, P et B en général (MPEG4), à  un framerate et un début précis, etc. Et en plus le tout pourrait (même si ce n'est à  priori pas ton cas ici ?) être couplé à  une bande son, le tout encapsulé dans le même flux, et à  synchroniser avec la vidéo pour pas qu'il n'y ait de décalage.

    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, ...)
  • AdrenalineAdrenaline Membre
    02:16 modifié #9
    ok, merci beaucoup!!  :)
  • AdrenalineAdrenaline Membre
    02:16 modifié #10
    Bon voilà  où j'en suis:

    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.
  • AliGatorAliGator Membre, Modérateur
    décembre 2010 modifié #11
    C'est quoi tes données brutes (ton "tableau de BYTE") ? Quelle représentation de l'image ?
    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 B) 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 ?
  • AdrenalineAdrenaline Membre
    02:16 modifié #12
    j'ai commencé simple,  avec une image monochrome, mon tableau représente les pixels.
  • AdrenalineAdrenaline Membre
    02:16 modifié #13
    dans 1291201296:

    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  :o

    pour le moment j'ai une appli coté pc qui se contente d'envoyer une image sous forme d'un tableau de pixels.
  • AliGatorAliGator Membre, Modérateur
    02:16 modifié #14
    Hé bé c'est pas le pb le plus simple auquel tu t'attaques pour commencer (cf les pb que tu risques de rencontrer que je t'ai évoqués)

    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)

  • AdrenalineAdrenaline Membre
    02:16 modifié #15
    Effectivement c'est pas le plus simple.

    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)
    <br />CGDataProviderRef imgProvider = CGDataProviderCreateWithData(NULL, imageBuffer, (imageSize), NULL);<br />CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceGray();<br />CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;<br />CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;<br />CGImageRef imageRef = CGImageCreate(Width, Height, 8,Dim*8, Width*Dim, colorSpaceRef, bitmapInfo, imgProvider, NULL, NO, renderingIntent);<br />	<br />UIImage *uiimage = [UIImage imageWithCGImage:imageRef];<br />[imageView setImage:uiimage];<br />
    


    mais ça marche pas  :(
  • AdrenalineAdrenaline Membre
    02:16 modifié #16
    Avec CGBitmapContextCreate(...) ça fonctionne , je vois enfin mon image  <3 (j'ai des petits décalages sur certaines lignes, c'est un autre problème, faut que je vérifie que le tableau est bien rempli)
  • AdrenalineAdrenaline Membre
    02:16 modifié #17
    de cette façon , j'arrive à  récupérer des images sur l'image, à  environ 3-4 images/ sec.

    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?
  • AdrenalineAdrenaline Membre
    02:16 modifié #18
    J'ai une question

    j'arirve à  afficher l'image dans l'UIImageView du simulator, mais pas dans l'iPad lui même
  • AliGatorAliGator Membre, Modérateur
    décembre 2010 modifié #19
    Pas du tout étonnant tes 3-4 images/sec, c'est même plutôt rapide je trouve (à  moins que ça ne soit sur le simu qui forcément est plus rapide car utilise le processeur et les ressources du Mac en réalité alors que sur l'iPad c'est de l'embarqué plus restrictif en terme de puissance)... et encore j'imagine que tu es encore avec des images N&B... imagine si tu veux passer à  la couleur !

    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)
  • AdrenalineAdrenaline Membre
    02:16 modifié #20
    merci Ali

    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


  • AdrenalineAdrenaline Membre
    02:16 modifié #21
    bon j'ai avancé

    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?
  • 02:16 modifié #22
    À mon AVI ça va être lent.

    (dsl  :P )
  • AdrenalineAdrenaline Membre
    02:16 modifié #23
    j'ai essayé cet exemple
    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 :(
  • AdrenalineAdrenaline Membre
    02:16 modifié #24
    bon je suis toujours dans la galère.

    je sais tjrs pas quelle piste prendre, j'ai beau relire les doc sur le http live streaming je suis toujours perdue

    help  :'(
Connectez-vous ou Inscrivez-vous pour répondre.