1

我想通过UDP套接字将从网络摄像头捕获的帧发送到我的android应用程序,并将它们显示为实时流。我能够在Android应用程序中接收图像,但我只能显示单张图像。不是流。 我所做的是以下。UDP图像流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 

如果我反复按下连接按钮,我得到的图像为流。我已经尝试过进行更新,但它很少更新图像,延迟很大。如何将这些接收到的图像作为实时流在应用程序上显示?

+0

我不确定,但我认为在数据报套接字中收到的数据包没有被序列化。你有没有考虑过这种情况? –

+0

即使他们没有序列化,他们应该被收到不止一次。我很少得到UI的更新。 –

+0

我覆盖'onPostExecute'函数以返回从套接字接收到的单个图像。在'doInBackground()'中删除了对'publishProgress()'的调用。 最后一步是重新初始化扩展AsyncTask的类对象并在'onPostExecute()'中执行它。 希望它可以帮助其他任何面临同样问题的人。 –

回答

0

AsyncTask对象只能执行一次,所以我无法接收流。但我通过遵循这个方法来实现它。

我覆盖onPostExecute()以返回从套接字接收到的单个图像。删除我的电话publishProgress()doInBackground()。最后一步是重新初始化扩展了AsyncTask的类对象,并在onPostExecute()中执行它,即在onPostExecute()中创建一个新对象并执行asyncobject.execute().get()。希望这有助于其他任何面临同样问题的人。