Android de prévisualisation de la caméra dans surfaceview
J'ai réussi à mettre de prévisualisation de la caméra dans surfaceview et cela fonctionne très bien. Mais maintenant j'ai un problème avec la vitesse des autres composants. Parce que maintenant, c'est vraiment lent.
Dois-je mettre la caméra dans le nouveau thread? Comment réduire le fps ou de résolution? Parce que ce que j'ai maintenant ne fonctionne pas correctement.
Ma surface d'affichage:
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 );
}
}
Mon 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>
.
.
.
Et comment je l'appelle en activité principale:
KameraSurface preview = new KameraSurface(getApplicationContext());
((FrameLayout) findViewById(R.id.preview)).addView(preview);
connexes: stackoverflow.com/questions/19919793/...
OriginalL'auteur Mihael Meklav | 2012-08-07
Vous devez vous connecter pour publier un commentaire.
Vous avez le choix de démarrer "startPreview" à l'intérieur d'un thread différent ..
pourquoi vous avez défini le taux d'image 1 .... débit d'image standard pour n'importe quel appareil photo est au moins 15 fps ... essayer la même chose ..
Mais il n'est pas nécessaire d'avoir 15fps.
OriginalL'auteur Daud Arfin
Je suis face à un même problème, mais j'ai eu cet aperçu de la taille de cette méthode, et maintenant mon aperçu de l'appareil photo fonctionne correctement.
OriginalL'auteur Jitendra ramoliya
Je n'ai pas testé ton code mais il y a beaucoup de facteurs qui pourraient contribuer à la faiblesse de l'expérience, y compris une mauvaise matériel. Si vous utilisez un émulateur de Windows, essayez de régler l'affinité de processus/de l'application de tout cœur de PROCESSEUR autre que 0. Il fonctionne plus rapidement dans l'unique mode de base.
Pas. Comme vous pouvez le lire ici https://stackoverflow.com/a/1243448/649979, il est déjà dans son propre thread séparé pour le thread GUI.
Cependant, comme nous l'avons découvert à travers les commentaires de l'accélération matérielle permet
<application android:hardwareAccelerated="true" ...>
http://developer.android.com/guide/topics/graphics/hardware-accel.htmlComment est censé fonctionner? Vous n'avez pas indiqué.
Et c'est testé sur quoi?
Sur goclever a103 tablette (ICS)
Avez-vous activé l'accélération Matérielle? developer.android.com/guide/topics/graphics/hardware-accel.html <application android:hardwareAccelerated="true" ...>
Je pense que c'est maintenant un peu plus vite... Autre moitié est probablement à cause de piou tablette.
OriginalL'auteur Graham Smith