1

Je veux envoyer des images, capturées à partir d'une webcam, à mon application Android via UDP Sockets, et les afficher de sorte qu'il apparaisse en direct. Je suis en mesure de recevoir des images sur l'application Android, mais je ne peux afficher qu'une seule image. Pas un flux. Ce que j'ai fait suit.UDP Image en streaming Android

public class getImage extends AsyncTask<String, Bitmap, Bitmap> { 
protected void onProgressUpdate(Bitmap... values) { 
    Log.i("onProgressUpdate", "done"); 
    imageDisplay.setImageBitmap(values[0]); //imageDisplay is an ImageView on UI 
    imageDisplay.invalidate(); 
}//end of onProgressUpdate 


protected Bitmap doInBackground(String... params) { 
//receive an image over socket 
publishProgress(bitmapimage); //update on UI 
return bitmapimage; 

}//end of getImage 


public void ConnectionButton(View v) { 
Connect = (Button) findViewById(R.id.Connect); 
//while(true) { 
    try { 
      clientsocket = new DatagramSocket(9999); 

     } catch (IOException e) { 
      Log.i("Connection", "exception while creating socket"); 
     } 

    try { 
      getImage obj = new getImage(); 
      receivedImage = obj.execute("9999").get(); //receive image and over stream 
      //obj.onProgressUpdate(receivedImage); 

     } 
    catch(Exception e){ 
    e.printStackTrace(); 
} 
    //}//endof while 
}//end of ConnectionButton 

Si j'appuie sur, le bouton Connecter à plusieurs reprises, j'obtiens des images sous forme de flux. J'ai essayé la mise à jour onProgress, mais il met à jour les images rarement avec un retard assez important. Comment puis-je faire afficher ces images reçues sur l'application en tant que flux en temps réel.

+0

Je ne suis pas sûr mais je pense que les paquets reçus dans les sockets de datagramme ne sont pas sérialisés. Avez-vous considéré ce cas? –

+0

Même si elles ne sont pas sérialisées, elles sont censées être reçues plus d'une fois. Je reçois très rarement des mises à jour sur l'interface utilisateur. –

+0

Je remplace la fonction 'onPostExecute' pour retourner une seule image reçue du socket. Retiré mon appel à 'publishProgress()' dans 'doInBackground()'. Et, la dernière étape était de réinitialiser l'objet de classe qui étendait AsyncTask et l'exécutait dans 'onPostExecute()'. J'espère que ça aide, quelqu'un d'autre confronté au même problème. –

Répondre

0

Un objet AsyncTask ne peut être exécuté qu'une seule fois, donc je n'ai pas pu recevoir de flux. Mais je l'ai réalisé en suivant le méhtod.

Je remplace onPostExecute() pour renvoyer une seule image reçue du socket. J'ai retiré mon appel au publishProgress() au doInBackground(). Et, la dernière étape consistait à réinitialiser l'objet de classe qui étendait AsyncTask et l'exécutait dans le onPostExecute(), c'est-à-dire créer un nouvel objet et asyncobject.execute().get() dans le onPostExecute(). J'espère que ça aide, quelqu'un d'autre confronté au même problème.