2012-08-07 130 views
3

我设法在Surfaceview中放置相机预览,并且这种方法效果很好。但是现在我遇到了其他组件速度的问题。因为现在它真的很慢。Surfaceview中的Android相机预览

我是否需要将相机放入新线程?如何降低fps或分辨率?因为这我现在不能正常工作。

我的面视图:

class KameraSurface extends SurfaceView implements SurfaceHolder.Callback { 
    private static final String TAG = "Preview"; 

    SurfaceHolder mHolder; 
    public Camera camera; 

    KameraSurface(Context context) { 
     super(context); 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     mHolder.setFormat(PixelFormat.RGB_332); 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_GPU); 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     // The Surface has been created, acquire the camera and tell it where 
     // to draw. 

     camera = Camera.open(); 

     Camera.Parameters p = camera.getParameters(); 
     p.setPictureSize(80, 60); 
     p.setColorEffect(android.hardware.Camera.Parameters.EFFECT_NONE); 
     p.setJpegQuality(20); 
     p.setPreviewFrameRate(1); 
     p.setPreviewFpsRange(5, 10); 
     p.setPreviewSize(80, 60); 
     camera.setParameters(p); 



     try { 
      camera.setPreviewDisplay(holder); 


      camera.setPreviewCallback(new PreviewCallback() { 

       public void onPreviewFrame(byte[] data, Camera arg1) { 
        //KameraSurface.this.invalidate(); 
       } 
      }); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // Surface will be destroyed when we return, so stop the preview. 
     // Because the CameraDevice object is not a shared resource, it's very 
     // important to release it when the activity is paused. 
     camera.stopPreview(); 
     camera = null; 
    } 
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     // Now that the size is known, set up the camera parameters and begin 
     // the preview. 
     Camera.Parameters parameters = camera.getParameters(); 
     parameters.setPreviewSize(80, 60); 
     camera.setParameters(parameters); 

     camera.startPreview(); 
    } 

    @Override 
    public void draw(Canvas canvas) { 
      super.draw(canvas); 
      Paint p= new Paint(Color.RED); 
      Log.d(TAG,"draw"); 
      canvas.drawText("PREVIEW", canvas.getWidth()/2, canvas.getHeight()/2, p); 
    } 
} 

我的XML:

. 
. 
. 
<TableRow 
      android:layout_width="match_parent" 
      android:layout_height="fill_parent" > 

      <FrameLayout 
       android:id="@+id/preview" 
       android:layout_width="133dp" 
       android:layout_height="100dp" 
       android:layout_margin="20dp" > 
      </FrameLayout> 
. 
. 
. 

和我的主要活动是如何调用:

KameraSurface preview = new KameraSurface(getApplicationContext()); 
       ((FrameLayout) findViewById(R.id.preview)).addView(preview); 
+0

相关:http://stackoverflow.com/questions/19919793/android-camera-onpreviewframe-frame-rate-not-consistent – 2016-05-18 13:12:29

回答

0

我没有测试你的代码,但是有许多可能导致体验不佳的因素,包括硬件不佳。如果您在Windows中使用模拟器,请尝试将进程/应用程序的关联性设置为除0以外的任何CPU内核。它在单核模式下运行得更快。

我是否需要将相机放入新线程?

不,您可以在这里阅读https://stackoverflow.com/a/1243448/649979,它已经在它自己的线程中与GUI线程分开。

然而,由于我们通过评论硬件加速发现有助于<application android:hardwareAccelerated="true" ...>http://developer.android.com/guide/topics/graphics/hardware-accel.html

如何降低fps或分辨率是多少?因为这个我现在所做的 无法正常工作。

应该如何工作?你没有概述这一点。

+0

我想减少FPS每秒5帧...但它似乎那不工作.. – 2012-08-07 12:13:53

+0

这是测试什么? – 2012-08-07 12:16:41

+0

在goclever a103平板电脑(ICS) – 2012-08-07 12:19:51

2

你可以选择启动“startPreview”不同的线程里面..

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    // Now that the size is known, set up the camera parameters and begin 
    // the preview. 
    Camera.Parameters parameters = camera.getParameters(); 
    parameters.setPreviewSize(80, 60); 
    camera.setParameters(parameters); 

    Thread preview_thread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
       camera.startPreview(); 
      } 
     }, "preview_thread"); 
     preview_thread.start(); 
    } 
+0

它仍然非常慢... – 2012-08-07 12:15:45

+1

为什么你有帧速率设置为1 ....任何摄像机设备的标准帧速率至少为15 fps ...尝试相同.. – 2012-08-07 12:17:15

+1

但是没有必要有15fps。 – 2012-08-07 12:19:14

2

我面临同样的问题,但我用这种方法得到这个预览大小,现在我的相机预览正常工作。

private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) { 
      final double ASPECT_TOLERANCE = 0.1; 
      double targetRatio = (double) h/w; 

      if (sizes == null) 
       return null; 

      Camera.Size optimalSize = null; 
      double minDiff = Double.MAX_VALUE; 

      int targetHeight = h; 

      for (Camera.Size size : sizes) { 
       double ratio = (double) size.height/size.width; 
       if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) 
        continue; 

       if (Math.abs(size.height - targetHeight) < minDiff) { 
        optimalSize = size; 
        minDiff = Math.abs(size.height - targetHeight); 
       } 
      } 

      if (optimalSize == null) { 
       minDiff = Double.MAX_VALUE; 
       for (Camera.Size size : sizes) { 
        if (Math.abs(size.height - targetHeight) < minDiff) { 
         optimalSize = size; 
         minDiff = Math.abs(size.height - targetHeight); 
        } 
       } 
      } 

      return optimalSize; 
     } 

    }