3

カメラのプレビューをサーフェスビューに入れることができましたが、これはうまく機能します。しかし今、他のコンポーネントの速度に問題があります。今は本当に遅いからです。

カメラを新しいスレッドに入れる必要がありますか? 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);
4

3 に答える 3

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(); 
    }
于 2012-08-07T12:12:29.060 に答える
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または解像度を下げる方法は?これは、私が今持っているものが適切に機能しないためです。

どのように機能するはずですか?あなたはこれについて概説していません。

于 2012-08-07T12:11:16.577 に答える