我设法将相机预览放在表面 View 中,效果很好。但现在我对其他组件的速度有疑问。因为现在真的很慢。
我需要把相机放在新线程吗?如何降低帧率或分辨率?因为我现在拥有的东西不能正常工作。
我的表面 View :
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>
.
.
.
以及我如何调用主要 Activity :
KameraSurface preview = new KameraSurface(getApplicationContext());
((FrameLayout) findViewById(R.id.preview)).addView(preview);
最佳答案
您可以选择在不同的线程中启动“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();
}
关于SurfaceView 中的 Android 相机预览,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11845519/