Android-Kamera-Vorschau in surfaceview
Ich zu verwalten, um die Kamera-Vorschau in surfaceview und das funktioniert Super. Aber jetzt habe ich problem mit der Geschwindigkeit der anderen Komponenten. Denn jetzt ist es wirklich langsam.
Brauche ich um die Kamera im neuen thread? Wie zu verringern die fps oder die Auflösung? Weil das was ich jetzt habe funktioniert nicht richtig.
Mein surface 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 );
}
}
Mein 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>
.
.
.
Und wie rufe ich im main-Aktivität:
KameraSurface preview = new KameraSurface(getApplicationContext());
((FrameLayout) findViewById(R.id.preview)).addView(preview);
Verwandte: stackoverflow.com/questions/19919793/...
InformationsquelleAutor Mihael Meklav | 2012-08-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie die Wahl, um zu starten "startPreview" in einem anderen thread ..
warum haben Sie legen die frame-rate wie 1 .... standard-Bildrate für jede Kamera-Gerät ist mindestens 15 fps ... das gleiche versuchen ..
Aber es gibt keine Notwendigkeit zu haben, 15fps.
InformationsquelleAutor Daud Arfin
Stehe ich vor demselben problem, aber ich habe diese Größe der Vorschau, die von dieser Methode und nun ist meine Kamera Vorschau richtig funktioniert.
InformationsquelleAutor Jitendra ramoliya
Ich habe deinen code nicht getestet, aber es gibt viele Faktoren, könnten dazu beitragen, eine träge Erfahrung, auch schlechte hardware. Wenn Sie mit einem emulator in Windows versuchen, die Einstellung der Affinität der Prozess/die Anwendung auf jedem CPU-Kern einen anderen Wert als 0. Es läuft schneller im single core-Modus.
Nicht. Wie Sie hier Lesen können https://stackoverflow.com/a/1243448/649979, es ist bereits in einem eigenen thread unabhängig vom GUI-thread.
Allerdings-wie wir erfahren-durch die Kommentare der Hardwarebeschleunigung hilft
<application android:hardwareAccelerated="true" ...>
http://developer.android.com/guide/topics/graphics/hardware-accel.htmlWie funktionieren soll? Sie haben nicht dargelegt.
Und das ist getestet auf was?
Auf goclever a103 tablet (ICS)
Haben Sie die Hardware-Beschleunigung aktiviert? developer.android.com/guide/topics/graphics/hardware-accel.html <application android:hardwareAccelerated="true" ...>
Ich denke, dass ist jetzt ein bisschen schneller... die Andere Hälfte ist wahrscheinlich, weil von einem Billig-tablet.
InformationsquelleAutor Graham Smith