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

Java ME Discussion :

Flux mjpeg probleme


Sujet :

Java ME

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Par défaut Flux mjpeg probleme
    Salut à tous !

    Bon voila, j'exploite une caméra IP AXIS qui transmet du flux MJPEG, sur l'émulateur WTK2.5 ca marche nikel, mais une fois sur le mobile ecran blanc ! et pourtant le flux est existant avec ethereal en passant par mon telephone, ca fais quelques jours que je galère avec ça je n'ais plus d'idée , et en plus avec le cout du Ko pour tester ca dans les conditions réel ca n'arrange pas les choses ...

    // 1er fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
     
    package photo;
     
    import javax.microedition.midlet.*;
    import javax.microedition.lcdui.*;
    import java.io.IOException;
    import java.io.*;
    import javax.microedition.*;
    import javax.microedition.io.HttpConnection;
    import javax.microedition.io.Connector;
    import java.*;
    import java.io.InputStream;
    import java.io.OutputStream;
     
     
    public class PhotoAlbum
        extends MIDlet
        implements CommandListener, ItemStateListener
    {
     
        private Display display;
        public String imageName;
        MJPEGParserA parser;
        private PhotoFrame canvas;
        HttpConnection c = null;
        InputStream is = null;
        OutputStream os = null;
     
     
     
      class MJPEGParserA {
       private  final byte[] JPEG_START = new byte[] { (byte) 0xFF, (byte) 0xD8 };
       private final int INITIAL_BUFFER_SIZE = 4096;
     
       InputStream in;
       byte[] boundary;
       byte[] segment;
       byte[] buf;
       int cur, len;
     
       boolean canceled = false;
     
       public boolean isCanceled() {
        return canceled;
       }
     
       public void setCanceled(boolean canceled) {
        this.canceled = canceled;
        if (canceled) {
         try {
     
          in.close();
     
                 System.exit(0);
     
         } catch (IOException e) {
         }
        }
       }
     
     
       public MJPEGParserA(InputStream in, String boundary) {
       this.in = in;
        this.boundary = boundary.getBytes();
        buf = new byte[INITIAL_BUFFER_SIZE];
        cur = 0;
        len = INITIAL_BUFFER_SIZE;
       }
     
     
       public void parse() throws IOException {
        int b;
        while ((b = in.read()) != -1) {
         append(b);
         if (checkBoundary()) {
          processSegment();
          cur = 0;
     
         }
        }
       }
     
     
       protected void processSegment() {
            Image source;
        boolean found = false;
     
        int i;
        for (i = 0; i < cur - JPEG_START.length; i++) {
         if (segmentsEqual(buf, i, JPEG_START, 0, JPEG_START.length)) {
          found = true;
          break;
         }
        }
        if (found) {
        int segLength = cur - boundary.length - i;
        segment = new byte[segLength];
        System.arraycopy(buf, i, segment, 0, segLength);
        source = Image.createImage(segment, 0, segLength);
        canvas.drawImage(source);       
        display.setCurrent(canvas);
        }
       }
     
     
       public byte[] getSegment() {
        return segment;
       }
     
     
       protected boolean segmentsEqual(byte[] b1, int b1Start, byte[] b2, int b2Start, int len) {
        if (b1Start < 0 || b2Start < 0 || b1Start + len > b1.length || b2Start + len > b2.length) {
         return false;
        } else {
         for (int i = 0; i < len; i++) {
          if (b1[b1Start + i] != b2[b2Start + i]) {
           return false;
          }
         }
         return true;
        }
       }
     
     
       protected boolean checkBoundary() {
        return segmentsEqual(buf, cur - boundary.length, boundary, 0, boundary.length);
       }
     
     
       public int getBufferSize() {
        return len;
       }
     
     
       protected void append(int i) {
        if (cur >= len) {
         byte[] newBuf = new byte[len * 2];
         System.arraycopy(buf, 0, newBuf, 0, len);
         buf = newBuf;
         len = len * 2;
        }
        buf[cur++] = (byte) i;
       }
     
      }
     
     
     void postViaHttpConnection(String url) throws IOException {
     
             String boundary = "--myboundary";
     
     
             try {
                c = (HttpConnection)Connector.open(url);
                is = c.openInputStream();
                parser = new MJPEGParserA(is, boundary);
                parser.parse();
     
             } catch (ClassCastException e) {
                 throw new IllegalArgumentException("Not an HTTP URL");
             } finally {
                 if (is != null)
                     is.close();
                 if (os != null)
                     os.close();
                 if (c != null)
                     c.close();
             }
         }
     
     public PhotoAlbum() {
         display = Display.getDisplay(this);
         canvas = new PhotoFrame(this); 
         canvas.setCommandListener(this);
     }
     
     
     protected void startApp() {
     
      try {
      postViaHttpConnection("http://217.128.151.33/axis-cgi/mjpg/video.cgi?camera=1@fps=25@resolution=160x120"); 
        }
         catch(IOException e)
       {
         }
     }
     
     
     protected void pauseApp() {
     }
     
     protected void destroyApp(boolean unconditional) {
     }
     
      public void commandAction(Command c, Displayable s) {
     }
     
     public void itemStateChanged(Item item) {
     }
     
     
    }







    // 2eme fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    package photo;
     
     
    import javax.microedition.lcdui.*;
    import javax.microedition.lcdui.game.*;
    import javax.microedition.midlet.*;
     
     
    public class PhotoFrame extends GameCanvas implements Runnable {
     
        private Thread thread;
        private Graphics g;
     
        public PhotoFrame(MIDlet midlet) {
     
            super(false);
             g = getGraphics();
     
        }
     
     
         void drawImage(Image pic) {
            g.drawImage(pic, 0, 0,
                    Graphics.TOP|Graphics.LEFT);
     
        }
     
     
     
        public void destroy() {
            hideNotify();
        }
     
        public void paint(Graphics g) {
            flushGraphics();
        }
     
        protected void showNotify() {
            thread = new Thread(this);
            thread.start();
        }
     
        protected void hideNotify() {
            thread = null;
        }
     
        public void run() {
             Thread mythread = Thread.currentThread();
     
            while (mythread == thread) {
                if (mythread == thread) {
                    flushGraphics();
                }
                try {
                    mythread.sleep(5);
                }
                catch (InterruptedException ie) {
                }
                catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
     
    }
    Oui je sais c'est pas petit ...
    Fichiers attachés Fichiers attachés

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 18
    Par défaut
    quel mobile?
    Le jpeg n'est pas reconnu par tous les mobiles...

  3. #3
    Membre averti
    Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Par défaut
    Bonjour

    Un siemens CX75, mais aucun prb pour afficher les JPEG deja testé, le probleme après différants tests c'est que le programme se met en sommeil à cette ligne "while ((b = in.read()) != -1)" jusqu'à ce qu'il y a un "SEQ FIN" pour enfin en sortir..

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 18
    Par défaut
    Ok,

    Les siemens ne sont pas très compatibles...

    postViaHttpConnection : doit être lancé dans un thread indépendant, pour éviter de bloquer l'execution de la midlet. C'est obligatoire de faire ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    protected void startApp() {
      Thread runner = new Thread(this);
    }
     
    public void run()
    {
      try {
      postViaHttpConnection("http://217.128.151.33/axis-cgi/mjpg/video.cgi?camera=1@fps=25@resolution=160x120"); 
        }
         catch(IOException e)
       {
         e.printStackTrace();
       }
     }
    Ensuite ton init pour l'httpConnection n'est pas complète:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
                c = (HttpConnection)Connector.open(url);
                c.setRequestProperty("Connection", "close");
                // Partie POST à ajouter
                int responseCode = c.getResponseCode();
                if (responseCode ==  HttpConnection.HTTP_OK)
                {
                 is = c.openInputStream();
                 parser = new MJPEGParserA(is, boundary);
                }
                else
                {
                // TODO gestion des erreurs http
                }
    Sur certains phones on doit passer en POST pour que cela marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    c = (HttpConnection)Connector.open(url);
    c.setRequestMethod(HttpConnection.POST)
    c.setRequestProperty("Connection", "close");
    OutputStream os = c.openOutputStream();
    os.write(new byte[4]); // Dummy post
    os.close(); // le os.flush(); avant n'est pas nécessaire et buggy sur certains modèles
    Ensuite l'utilisation de in.read() n'est pas très optimisée il faudrait faire 2 cases avec c.getLength() != 1 mais bon. Dans un premier temps remplace le while par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    byte[] buf = new byte[1000];
    while ((b = in.read(buf)) > 0)
    {
        for (int i = 0; i < b; i++)
        {
           append(buf[i]);
           if (checkBoundary()) {
            processSegment();
            cur = 0;
           }
        }
    }
    Certains téléphones ne renvoie jamais -1

    Sinon ta gestion du GameCanvas pourrait poser problème sur Siemens.

    A partir de là surtout avec HttpConnection.HTTP_OK tu peux voir si cela fonctionne. Car il faut aussi vérifier si ton APN java est configuré correctement, 90% des problèmes de connection J2ME viennent de là.

    Mik

  5. #5
    Membre averti
    Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Par défaut
    Salut,

    J'ai fais les differantes modifs que tu m'as proposé, mais tjrs le meme prb il se bloque sur " in.read", alors que dans l'emulateur ca fonctionne .

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 18
    Par défaut
    L'emulateur n'est jamais une reference

    As tu testé avec Opera Mini pour voir si le problème ne vient pas de ta configuration APN?
    Sur le server tu as le moyen de voir les logs de connection?

    Bon je viens de tester le jad/jar que tu as mis sur hardware.fr cela fonctionne sur SonyEricsson K800...Dc change de phone

    Addendum: en y reflechissant le prb pourrait ne pas venir de la connection http, mais plutot de ton refresh sur le GameCanvas, les Siemens sont très susceptibles là dessus. Dommage que le site de Siemens Mobile Dev est down. Il faudrait que tu trouves le SMTK pour voir comment ils font avec un Timer plutot qu'un thread le refresh...ça fait un moment que je n'ai pas revu ce code.

Discussions similaires

  1. [flux/socket]probleme client
    Par xelif dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 12/01/2014, 21h35
  2. android flux mjpeg
    Par raimus88 dans le forum Android
    Réponses: 9
    Dernier message: 17/02/2011, 09h15
  3. émission flux MJPEG
    Par aziatedu13 dans le forum Multimédia
    Réponses: 1
    Dernier message: 25/02/2008, 16h06
  4. Création de flux MJPEG
    Par aziatedu13 dans le forum Multimédia
    Réponses: 2
    Dernier message: 22/02/2008, 13h11
  5. Affichage d'un flux mjpeg venant d'une Webcam
    Par olive_le_malin dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 21/02/2008, 09h22

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