Lire une vidéo... dans une texture

AliGatorAliGator Membre, Modérateur
12:29 modifié dans API UIKit #1
Bonjour à  tous,

Voilà  je me suis mis à  OpenGL ES j'ai une petite scène 3D avec des textures sur mes faces...
Maintenant je voudrais rendre une vidéo comme texture.

Pour lire des vidéos, j'ai bien vu le framework MediaPlayer.framework mais ça ne sait lire les vidéos qu'en plein écran.

Je suis déjà  en train de tester un rendu d'une WebView dans une image pour la transformer en texture (merci CALayer et renderInContext), rien à  voir avec les vidéos mais pour déjà  voir ce que ça donne...
Mais pour les vidéos, je vois pas, je m'attendais à  trouver une QTView ou ce genre pour utiliser la même méthode, demander le rendu dans une texture et basta... mais ça n'a pas l'air dispo pour l'iPhone tout ça  :(

Une idée ?

Si je pouvais au moins récupérer la PosterFrame de la Movie, l'idéal étant de pouvoir récupérer à  tout instant T la texture de la movie... Mais y'a pas l'air d'y avoir grand chose... J'ai loupé un truc dans l'API ?

Réponses

  • AliGatorAliGator Membre, Modérateur
    12:29 modifié #2
    Up !

    Personne ne sait ?
    Même pas une solution, une alternative, une idée, pour décoder de la vidéo et récupérer les UIImages ou les textures de la vidéo ?

    D'ailleurs dans la foulée j'aimerai bien récupérer le flux vidéo de la camera (pas pour l'enregistrer hein, juste pour faire un traitement dessus et afficher le résultat à  l'écran)... Genre afficher à  l'écran ce que voit la camera (comme quand on est en passe de prendre une photo avec l'API UIImagePickerController ou l'appli Appareil Photo), mais en appliquant un filtre sur l'image...
  • schlumschlum Membre
    12:29 modifié #3
    Mala doit savoir pour le flux vidéo...
    Par contre, pour l'OpenGL, je ne sais pas s'il y a beaucoup de spécialistes ici.
    Peut-être du côté de NeHe  ???
  • CéroceCéroce Membre, Modérateur
    12:29 modifié #4
    Ce n'est pas un problème d'OpenGL. La difficulté c'est de récupérer les images. Les placer dans la mémoire vidéo, c'est très classique.
  • MalaMala Membre, Modérateur
    12:29 modifié #5
    API iPhone et OpenGL ES: Non, je ne saurais répondre pour le coup.

    Désolé.
  • CeetixCeetix Membre
    12:29 modifié #6
    D'ailleur auriez-vous un bon site pour apprendre openGL ES ?
  • schlumschlum Membre
    12:29 modifié #7
    dans 1237487235:

    API iPhone et OpenGL ES: Non, je ne saurais répondre pour le coup.

    Désolé.


    Tu ne fais pas l'acquisition vidéo avec SAM ? Il m'avais semblé avec les démos  ???

  • NoNo Membre
    12:29 modifié #8
    dans 1237518328:

    Tu ne fais pas l'acquisition vidéo avec SAM ? Il m'avais semblé avec les démos  ???


    SAM sur iphone ?
  • MalaMala Membre, Modérateur
    12:29 modifié #9
    dans 1237533540:

    dans 1237518328:

    Tu ne fais pas l'acquisition vidéo avec SAM ? Il m'avais semblé avec les démos  ???


    SAM sur iphone ?


    +1  :P
  • schlumschlum Membre
    12:29 modifié #10
    Ah ouais, j'ai un peu zappé que c'était un sujet iPhone  :P

    Mais... je croyais que l'appareil photo de l'iPhone ne gérait pas la vidéo  ???
  • NoNo Membre
    12:29 modifié #11
    dans 1237540446:

    Mais... je croyais que l'appareil photo de l'iPhone ne gérait pas la vidéo  ???


    Pas de manière directe (mais il existe des logiciels qui simulent ça en prenant des sériee de photo).

    Pour Aligator, je pense qu'il parle d'une vidéo style un fichier vidéo qu'il veut ensuite mapper dans sa texture.
    Si le sdk offre ce qu'il faut pour lire et afficher une vidéo dans une view, par contre, il n'y a pas l'équivalent QuickTime de OSX sur l'iphone... Donc difficile de pouvoir lire par programmation les vidéos pour ensuite les manipuler (en dehors d'une view).
  • AliGatorAliGator Membre, Modérateur
    12:29 modifié #12
    L'appareil photo de l'iPhone ne gère en effet pas la vidéo. Dans le sens où on a une API pour prendre des photos (et les sauver dans le logiciel "Photos" de l'iPhone), mais pas pour prendre des vidéos et les enregistrer.

    En gros l'API c'est une classe UIImagePickerController qu'on alloc/init puis qu'on "push" pour qu'elle s'affiche à  l'écran, à  partir de ce moment là  c'est elle qui gère toute l'interface :
    - elle affiche une vue dans laquelle tu vois ce que la camera de l'iPhone est en train de viser (donc si tu bouges l'iPhone ou que les gens filmés bougent, bah tout ça bouge aussi dans la vue, dans ce sens c'est une vidéo même si tu ne l'enregistres pas tu vois le flux de la camera en live quoi), et un bouton en dessous à  cliquer pour prendre la photo.
    - Une fois que l'utilisateur a cliqué pour prendre la photo, si tu as configuré l'UIImagePickerController pour autoriser l'édition de la photo, ça t'affiche une vue te permettant de rogner la photo (tu zoomes et déplaces sur la partie de la photo qui t'intéresse) et de valider.
    - Une fois que tout ça est fait, le UIImagePickerController disparait, te ramenant ton écran iPhone où tu étais avant de l'appeler, et une méthode du delegate de UIImagePickerController est appellée, passant en paramètre la UIImage* correspondant à  la photo prise.



    Donc en résumé l'API pour l'appareil photo ne permet que de prendre une photo (qui sera enregistrée de toute façon dans le logiciel "Photo" de l'iPhone), pas d'enregistrer une vidéo, mais, et on le voit bien quand on est en train de prendre une photo, techniquement c'est possible d'avoir un flux continu de ce que voit la camera... et moi c'est ce flux que j'aimerai récupérer, je m'en fiche de pas pouvoir l'enregistrer sous forme de vidéo au contraire je préfère avoir une suite de UIImage ou CGImageRef qui me serait envoyées pour l'afficher dans une UIImageView après le traitement que je veux lui appliquer.
  • AliGatorAliGator Membre, Modérateur
    12:29 modifié #13
    dans 1237541363:

    Pour Aligator, je pense qu'il parle d'une vidéo style un fichier vidéo qu'il veut ensuite mapper dans sa texture.
    Si le sdk offre ce qu'il faut pour lire et afficher une vidéo dans une view, par contre, il n'y a pas l'équivalent QuickTime de OSX sur l'iphone... Donc difficile de pouvoir lire par programmation les vidéos pour ensuite les manipuler (en dehors d'une view).
    En fait j'ai 2 use-cases potentiels :

    1) J'ai un fichier vidéo sur l'iPhone et je veux pouvoir le mapper dans une vue OpenGL, et pour ça il me faut le buffer des pixels pour chaque frame de la vidéo. Récupéré sous forme de tableau C, de CGImageRef ou de UIImage je m'en fiche, du moment que j'ai de quoi les pixels pour créer ma texture.

    2) Je veux afficher dans une view l'image prise par la camera, sur laquelle j'aurais éventuellement rajouté un traitement (filtrage, modification, overlay...)

    D'ailleurs pour info j'ai même pas vu dans l'API de quoi "lire et afficher une vidéo dans une view" comme tu dis NO : la seule manière de lire une vidéo que j'ai trouvé, c'est avec le MediaPlayer.framework, qui oblige à  lire la vidéo en plein écran (on peut par contre rajouter des contrôles en overlay dessus, mais la vidéo est obligatoirement plein écran et pas affichable dans une UIView personnalisée
  • NoNo Membre
    12:29 modifié #14
    dans 1237541881:

    D'ailleurs pour info j'ai même pas vu dans l'API de quoi "lire et afficher une vidéo dans une view" comme tu dis NO : la seule manière de lire une vidéo que j'ai trouvé, c'est avec le MediaPlayer.framework, qui oblige à  lire la vidéo en plein écran (on peut par contre rajouter des contrôles en overlay dessus, mais la vidéo est obligatoirement plein écran et pas affichable dans une UIView personnalisée


    Oui tu as raison.
    J'ai fait un raccourci un peu rapide en parlant de view...
  • KyoKyo Membre
    12:29 modifié #15
    Salut, je cherche à  peu près à  faire comme toi lire une vidéo dans une vue (c'est à  dire avoir une lecture en mode réduit). Y a une application qui fait ça, c'est orange TV, si tu as des pistes de programmation je suis preneur (je suis encore débutant  :P)
  • schlumschlum Membre
    12:29 modifié #16
    Pourquoi les débutants cherchent à  faire de trucs de fous au lieu d'apprendre les bases ?  ???
  • AliGatorAliGator Membre, Modérateur
    avril 2009 modifié #17
    Pour tout dire j'avais bien vu qu'Orange TV effectuais cette tâche de lecture de vidéo en mode non plein-écran.

    Alors 2 points :

    1) J'ai téléchargé et fait un peu l'étude (pas vraiment du retro-engineering mais presque) de l'appli OrangeTV (regardé les frameworks qu'elle utilise, etc.) :
    - elle n'utilise pas du tout MediaPlayer.framework ! Par contre elle utilise les frameworks AudioToolBox et OpenAL pour la gestion du son... mais je n'ai pas vu parmi les librairies partagées utilisées de lib qui serait liée au décodage vidéo.
    - par contre elle est linkée avec libstdc++, ce dont je ne vois pas l'intérêt... à  part si on veut coder en Objective-C++... ce qui n'est la plupart du temps utile que lorsqu'on a besoin de linker (statiquement ou dynamiquement) avec une librairie écrite en C++.
    - Du coup j'imagine fortement qu'ils utilisent une librairie externe (j'aurais bien dit qu'il y'a des chances que ce soit libavcodec mais en même temps elle est en C et pas C++) et qu'ils ont linké leur code avec cette librairie en statique (ce qui explique qu'elle n'apparaisse pas dans la liste des librairies dynamiques utilisées que j'ai pu extraire de mon analyse de l'appli).

    Conclusion, ils utilisent une lib externe et pas les frameworks Apple pour ce qui est du décodage vidéo... Du moins c'est la seule conclusion à  laquelle j'arrive... Et je ne crois pas qu'il y ait bcp d'autre choix en fait pour faire de la lecture vidéo non-plein-écran.
    Restera à  regarder les possibilités de librairies disponibles pour ça (il y a certainement une version de l'excellent libavcodec dispo pour l'iPhone, voire même sans doute optimiser et compilée pour utiliser la puce de décodage intégrée à  l'iPhone quand c'est possible, peut-être ?!) et leurs performances (décodage software ou hardware, etc.)



    2) Cependant pour ma part j'ai réussi à  contourner un peu le problème pour certains use-cases, même si c'est un peu un hack : dans le cas où je veux juste décoder une vidéo sans qu'elle prenne tout l'écran, pour mettre qques boutons et un peu d'interface autour, l'astuce c'est que j'utilise MediaPlayer.framework, mais une fois que j'ai lancé le "play" et que je sais que la fenêtre vidéo plein écran est chargée, je récupère la UIWindow créée par le MoviePlayerController, je creuse un peu dans ses subviews (j'ai fait un peu d'introspection dans la view hierarchy), et j'applique une CGAffineTransform à  la vue qui affiche la vidéo.
    --> Du coup j'ai toujours la UIWindow en full screen, mais j'ai réduit la vidéo via la CGAffineTransform pour la positionner en bas à  gauche de l'écran, à  l'endroit que je veux... et j'ai ensuite rajouté via code mes autres éléments d'interface (UILabel, UITextView, UIButton, ...) via des addSubview sur la UIWindow du player.

    Pour faire tout ça je me suis un peu inspiré de l'exemple d'Apple qui montre comment rajouter un "overlay" par dessus le MoviePlayer pour rajouter mes contrôles... et quand j'ai pensé à  l'astuce d'appliquer un CGAffineTransform, j'ai créé une petite méthode qui me liste récursivement les subviews d'une UIView donnée, et je lui ai passé la UIWindow créée par le MoviePlayerController...

    ---

    Bon, je te l'accorde, c'est un peu de la bidouille, et il reste encore 2-3 trucs pas supers genre si je veux changer de vidéo en plein milieu, faut arrêter le player et en recréer un autre, car c'est à  la création du MoviePlayerController qu'on fournit la movieURL, ou encore je perd les contrôles de pause/avance/retour rapide/son/... sur la vidéo aussi (si je les met dès que je les manipule ça remodifie la CGAffineTransform donc bon).
    Et puis ça solutionne pas le cas où on voudrait mettre une vidéo en texture d'une scène 3D par exemple, pour récupérer les images une par une.
    Mais si c'est juste pour réduire un peu la vidéo, et que tu n'as pas besoin des contrôles vidéo, cet artifice peut suffire...
  • KyoKyo Membre
    12:29 modifié #18
    Je suis actuellement en Master 2 Informatique (J'ai les bases en programmation). Mais j'ai commencé à  faire du développement sur xcode que tout récemment (1er avril) dans le cadre d'un stage de fin d'études. Et pour mon projet, j'aurais sûrement besoin de pouvoir lire la vidéo en mode réduit. J'étudie la faisabilité par rapport au temps imparti car sinon je me contenterai de la lecture en full screen.

    Merci pour ta réponse Ali, je vais creuser dans cette direction


Connectez-vous ou Inscrivez-vous pour répondre.