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()。希望這有助於其他任何面臨同樣問題的人。