IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

InputStream, InputStreamReader,.. Decoupage d'un flux continue d'octet en temps réel


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Par défaut InputStream, InputStreamReader,.. Decoupage d'un flux continue d'octet en temps réel
    Bonjour a tous,

    Je dispose d'une caméra IP pour un projet. Il y a deux modes d'acquisitions possible:
    - Le mode PUSH: avec un timer, j'envois une requete a la caméra pour demander l'image courrante, je reçois la reponse sous forme d'un flux fini, que je converti en Image grace à la classe ImageIO. jusqu'ici, rien de tres compliqué (avec des URL, URLConnexion, BufferedInputStream, etc...)

    Ce mode étant un peu lourd du fait qu'il y a requete/reponse a chaque top du timier, le meilleur mode est le mode Pull, qui consiste a envoyer une requete spécifique a la caméra, qui envois une reponse continue, sans interruption, sous forme de flux d'octets correspondant a une succession d'images, séparés par un délimiteur connu.

    Au debut de chaque image, j'ai 3 lignes de textes qui m'indiquent la séparation. l'une de ses lignes spécifie la longueur du flux correspondant a l'image qui suit.

    j'ai essayé d'implementer un bout de code pour utiliser ce mode, mais je n'ai pas réussi a avoir le resultat!

    si quelqu'un peut me dire comment faire en sorte que le flux soit decoupé au niveau des delimiteurs, et qu'a chaque decoupe, j'envois le contenu de ce qui a été recupéra pour etre converti en image, ce serai super!! j'ai un peu de mal avec les InputStream et compagnie quand le flux est continue.

    Merci a tous

  2. #2
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 093
    Par défaut peut-être une idée
    Bonjour,
    Je ne suis pas spécialiste des flux, mais ce que vous décrivez ressemble à un flux RTP. Vous avez regardez du côté de l'API Java Média Framework. Cet ensemble permet de se connecter sur des flux réseau multimédia continue...
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    c'est à toit de lire à la main ce protocole en lisant le inputstream, en localisant le début et la longueur puis une fois la longueur atteinte relire le nouvel header, etc.

    Rien d'énormément difficile mais pas de classe java qui prémache le travail pour toi, juste Inputstream.

    Note: évite la tentation de mélanger inpustreamreader. Tu va devoir lire le texte de spération en binaire.

    Edit: si il s'agit d'une réponse multipart standard , commons http-client pourrait t'être utile.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Par défaut
    Merci pour les deux reponses que vous m'avez donné,
    Effectivement, avec la JMF, ça aurait pu se faire facilement, mais je n'ai pas envie de l'installer pour une si petite opération.

    Pour ta reponse tchize_, j'ai bien essayé de faire ça! le probleme etant que quand je fais un read, j'avance d'une position dans le flux, donc comment, en meme temps verifier la presence d'un delimiteur qui est en fait "--myboundary", et en meme temps, stoquer les bytes pour les convertir en image? sur tout que "--myboundary" n'est que la 1ere ligne qui ne fait pas partie de l'image! il y en a deux qui la suive, dont l'une d'elle donne quelques chose du genre "content-legth: 48521" ou un truc du genre... (la caméra n'est pas a porté de main maintenant pour que je sois plus précis)

  5. #5
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 093
    Par défaut Pourquoi pas...
    Ok, lire le flux en binaire c'est de toute façon la seule chose à faire. Mais il va falloir reconstituer les images car si j'ai bien compris, la caméra envoie trois ligne de textes qui se terminent par un CR, puis un flux sérialisé. Il va donc falloir connaître la résolution des images pour les reconstituer sinon je ne vois pas comment cela serait possible. Je suppose donc que dans l'une de ces trois lignes se trouve la définition de cette résolution. A moins que la longueur que vous cité représente un nombre de frame dans une résolution fixe qu'il vous faut connaître. L'un ou l'autre en tout cas, parceque avec un InputStream, ce sera éffectivement à vous de tout construire manuellement.
    Pourriez-vous nous montrer ces fameuses trois lignes...
    A dernière chose, si vous voulez pas JMF, essayez avec VLC....
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    oui ou la caméra, comme beacoup de caméra basique, envoie en continu des fichier image complet (et comme il l'a dit, ca il arrive déjà a ouvrir)

    Pour lire le binaire, ben y a pas le choix, faut lire byte par byte jusqu'à trouver un \n, prendre le bytes que t'as lu depuis les dernier \n et en faire une ligne de texte que tu interprète
    ensuite rebelotte
    quand t'as reçu la ligne vide (à priori), le flux commence ce moment là et tu lit n byte dedans (n étant le nombre précédement récupéré des lignes texte)

    et on recommence

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Par défaut
    Bonjour à tous,

    Alors voila, en ce qui concerne la question que j'ai posé ici, j'ai un peu laissé de coté ce probleme pour travailler sur autre chose, mais en ce debut de semaine, j'ai pris la caméra en question, et je me replonge donc dans cette histoire...

    Je vais essayer quelques idées et vous tiendrai au courant des resultats, mais je suis toujours a l'ecoute de toute suggestion, ou mieux, de façon de faire!

    Je reviendrai ici tout a l'heure, mais j'ai effectué une petite capture d'ecran de l'affichage du flux pour vous l'afficher.

    En fait, j'ai juste mis un BufferedReader qui reçoit la reponse continue de la caméra, et qui affiche ligne par ligne ce qu'il contient. J'ai demandé l'affichage du texte correspondant au flux pour 3 images seulement (je lui ai demandé de s'arreter au 4eme "--myboundary" qu'il rencontre).

    Si ça peut donner une idée a ceux que ça interesse de m'aider. Je vous en remercie d'avance. J'espere que le petit bricolage que je m'apprete a faire reglera le probleme

    PS: désolé pour la qualité de l'image! je l'ai redimensionné (/2) pour que la taille respecte la limite imposée! j'ai l'originale qui est nettement mieux, mais bon!
    Images attachées Images attachées  

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Par défaut
    Bonjour a tous,
    ça y est!!! j'y suis enfin arriver!! j'ai créé mom petit lecteur qui arrive a recevoir le flux continu et qui affiche les images!! j'ai de la vidéo

    Merci pour toutes tes reponses tchize_, en fait,tu avais raison. j'ai fini par avoir le resultat que je voulais, et cela pour les deux caméra differentes, rien qu'avec le InputStream, et aucune autre classe de flux!!!

    Je vais mettre ce post en "Resolu", je doute qu'il y ait grand monde qui ait eu le meme probleme que moi, donc pour l'instant, je ne vais pas trop detaillé la marche a suivre (qui est en plus toute simple), mais si ça interesse quelqu'un, pas de soucis, je suis dispo pour l'afficher.

    Encore merci a tous, et spécialement a toi tchize_.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 177
    Par défaut
    Bonjour

    Je dois faire exactement ce travail de lire un flux MJPEG. J'arrive à afficher une image en lisant le début d'un boundary, avec ma ligne 3 j'arrive à avoir ma longueur de mon image. Le prob est que je n'arrive qu'à afficher qu'une image.

    Comment je pourrais proprement utiliser le contentype multipart pour lire d'affiler mes images. Pour l'instant je requete, je sors mon inputstream, je le met ds un tab de byte, je lis ligne par ligne, je récupère la longueur de l'image, je lis la premiére ligne puis toute l'image (grace à ma longueur que j'ai récupéré).

    Est ce que je dois refaire toute la meme manipulation (requete, byte, lecture ligne) des que je 'affiche une image ou je dois faire autrement ?

    Je pensais qu'avec une requete ayant un contentype multpart cela m'ouvrait un tunnel qui ne se refermait pas. Donc pas besoin de requête une autre fois. Est ce que je fais erreur ?

    Ca parait un peu bête comme question mais il doit me manquer une infos.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. socket et flux continue
    Par topolino dans le forum Développement Windows
    Réponses: 3
    Dernier message: 25/07/2014, 09h03
  2. Réponses: 8
    Dernier message: 24/11/2011, 14h09
  3. Réponses: 0
    Dernier message: 19/05/2010, 09h25
  4. Applet Java sur Boursorama (flux continu) - port 8000
    Par Invité dans le forum Applets
    Réponses: 4
    Dernier message: 02/02/2006, 23h05
  5. [Stratégie] Lecture ponctuelle d'un flux continu
    Par christopheJ dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 30/07/2004, 16h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo