2011-01-31 54 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