2011-01-31 51 views
0

這是我的理解(請糾正我,如果我走了商標)我的使用線程正確將允許應用程序看起來多任務,儘管高處理器負載。使用線程的滯後應用程序的問題

在我的應用我有我處理來自相機預覽拍攝的圖像,並試圖做到實時人臉檢測與成功的很大一個線程。問題在於,同時我希望在屏幕上能夠按下按鈕,並且採取了一些與攝像機檢測方法相關的操作。

的問題是人臉檢測是相當快,但是當我去按按鈕它需要一個良好的第二個左右對此作出迴應。如果沒有激活面部檢測線程(即不會調用start()方法),該按鈕非常快速。下面是我的代碼剝離版本,因爲它太長只是直職位,因爲它是:

public void surfaceCreated(SurfaceHolder holder) { 
     mCamera = Camera.open(); 
     faceThread = new Thread(new Runnable(){ 
      public void run(){ 
       //Get camera preview image and detect faces 
      } 
     }); 
     faceThread.start(); 
    } 

public void onClickShoot(View v) throws InterruptedException, 
      media = new MediaPlayer(); 
    media.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     public void onCompletion(MediaPlayer mp) { 
      media.stop(); 
      media.reset(); 
     } 
    }); 
    media.setDataSource(this, dataPath); 
    media.prepare(); 
    media.start(); 
      //And some other stuff here too. 

    } 

難道只是我對實際上這個延遲它是一個移動平臺,我的期望太高的限制許多?或者有什麼方法可以完成這項工作?如果你需要更多關於我在做什麼的信息,請點擊:)。

編輯(更多的代碼來解決問題):

mCamera.setPreviewCallback(new PreviewCallback() { 
        public void onPreviewFrame(final byte[] _data, Camera _camera) { 
         Camera.Parameters parameters = mCamera.getParameters(); 
         int format = parameters.getPreviewFormat(); 
         // YUV formats require more conversion 
         if (format == ImageFormat.NV21) { 
          int w = parameters.getPreviewSize().width; 
          int h = parameters.getPreviewSize().height; 
          // Get the YuV image 
          YuvImage yuv_image = new YuvImage(_data, format, w, h, null); 
          // Convert YuV to Jpeg 
          Rect rect = new Rect(0, 0, w/3, h); // Rect of the image in which to search for the face 
          final ByteArrayOutputStream output_stream = new ByteArrayOutputStream(); 
          yuv_image.compressToJpeg(rect, 10, output_stream); 
          // Convert from Jpeg to Bitmap 
          detectFaces(BitmapFactory.decodeByteArray(
            output_stream.toByteArray(), 0, 
            output_stream.size())); 
          Log.v("TEST", "TEST"); 
         } 
        } 
       }); 


public void detectFaces(Bitmap bmp) { 
     FaceView faceView = new FaceView(this, bmp); 
} 

回答

3

您需要確定競爭是。是CPU時間還是其他資源?它可能有助於做一些分析...蒂姆佈雷最近寫了一個很好的介紹如何以及爲什麼要這樣做:http://android-developers.blogspot.com/2010/10/traceview-war-story.html

爲什麼它的價值MediaPlayer是臭名昭着緩慢和重量級。你給了什麼媒體?你是否給它一個主要在內存中的流或緩衝區,或者它是否會通過網絡或存儲讀取媒體的大量I/O?

出於興趣,一旦按鈕被按下,您爲什麼需要面部檢測?也許你可以在啓動媒體播放器之前停止線程?

+0

我敢肯定的論點是CPU時間的人臉檢測與媒體播放器不sahre比一個非常小的圖像之外的任何資源。媒體是一個非常小的.wav文件,它存儲在資源的原始文件夾中,因此沒有重量級的流媒體。在聲音播放後需要立即再次啓動人臉檢測,我嘗試在線程上使用等待(100)調用,但沒有改變延遲的事實。他們的收穫是否阻止了等待的線索? – SamRowley 2011-01-31 15:44:46