相机preVIEW是越来越捉襟见肘捉襟见肘、相机、preVIEW

2023-09-05 07:02:50 作者:依旧゛一个人

我已经写了code是用来显示相机。以下是我的布局文件中的code,

I have written a code that used to display camera. Following is my layout file's code,

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <FrameLayout
        android:id="@+id/previewLayout"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </FrameLayout>

    <LinearLayout
        android:id="@+id/startBar"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:background="@drawable/leftbarbg"
        android:orientation="vertical" 
        android:gravity="center">

        <ImageView
            android:id="@+id/MuteBtn"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="2"
            android:src="@drawable/mutebtn" />

        <ImageView
            android:id="@+id/VideosBtn"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="2"
            android:src="@drawable/videosbtn" />

        <ImageView
            android:id="@+id/RecBtn"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="3"
            android:src="@drawable/action_rec_selected" />

        <ImageView
            android:id="@+id/SettingsBtn"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="2"
            android:src="@drawable/settingsbtn" />

        <ImageView
            android:id="@+id/ChatBtn"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="2"
            android:src="@drawable/chatbtn" >
        </ImageView>
    </LinearLayout>

    <RelativeLayout
        android:id="@+id/stopBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="3dp"
        android:visibility="gone" >

        <ImageView
            android:id="@+id/StopBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/stopbtn" />
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="20dp"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="70dp"
        android:layout_marginTop="20dp" >

        <ImageView
            android:id="@+id/MenuBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:src="@drawable/menubtn" />

        <ImageView
            android:id="@+id/LiveModeBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:src="@drawable/livemodeoff" />

        <Chronometer
            android:id="@+id/video_chronometer"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:textSize="28sp"
            android:textStyle="bold" />
    </RelativeLayout>

</RelativeLayout>

这是CameraSurfaceview我的code,

And this is my code of CameraSurfaceview,

public class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
    private SurfaceHolder holder;
    private Camera camera;
    private MediaRecorder mediaRecorder;
    private Boolean previewing;
    private AutoFocusManager autoFocusManager;
    private CameraDetectionObserver cameraDetectionObserver;


    public CameraSurfaceView(Context context, AutoFocusManager autoFocusManager, CameraDetectionObserver cameraDetectionObserver) {
        super(context);
        this.holder = this.getHolder();
        this.holder.addCallback(this);
        this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        this.autoFocusManager= autoFocusManager;
        this.cameraDetectionObserver= cameraDetectionObserver;  
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        if (camera != null) {

            Camera.Parameters parameters = camera.getParameters();
            List< String > FlashModes = parameters.getSupportedFlashModes();
            if (FlashModes.contains(Parameters.FLASH_MODE_AUTO)) {
                parameters.setFlashMode(Parameters.FLASH_MODE_AUTO);
                System.out.println("FLASH_MODE_AUTO");
            }
            List< String > WhiteBalance = parameters.getSupportedWhiteBalance();
            if (WhiteBalance.contains(Parameters.WHITE_BALANCE_AUTO)) {
                parameters.setFlashMode(Parameters.WHITE_BALANCE_AUTO);
                System.out.println("WHITE_BALANCE_AUTO");
            }

            List< String > Antibanding = parameters.getSupportedAntibanding();
            if (Antibanding.contains(Parameters.ANTIBANDING_AUTO)) {
                parameters.setAntibanding(Camera.Parameters.ANTIBANDING_AUTO);
                System.out.println("ANTIBANDING_AUTO");
            }

            List<Size> previews = parameters.getSupportedPreviewSizes();
            int i = 0;

            parameters.setPreviewSize( previews.get(4).width, previews.get(4).height );
            camera.setParameters(parameters);
            camera.startPreview();
            autoFocusManager.startAutoFocus(camera);
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {

        if (camera != null) {
            camera.release();
            camera = null;
        }

        try {
            camera = Camera.open(findBackFacingCamera());
            camera.setPreviewDisplay(holder);
            previewing = true;
            cameraDetectionObserver.cameraInitializationStatus(true);
        } catch (IOException e) {
            camera.release();
            camera = null;
        }catch (Exception e) {
            e.printStackTrace();
            cameraDetectionObserver.cameraInitializationStatus(false);
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        if (previewing) {
            camera.stopPreview();
            camera.release();
            camera = null;
            previewing = false;
            autoFocusManager.stopAutoFocus();
            System.out.println("surface destroyed"); 
        }
    }

    public void stopPreview(){
        if (previewing) {
            camera.stopPreview();
            camera.release();
            camera = null; 
            previewing = false;
            autoFocusManager.stopAutoFocus();
            System.out.println("surface destroyed");    
        }
    }

    public Camera getCamera()
    {
        return this.camera;
    }

    public MediaRecorder getMediaRecorder(){
        mediaRecorder = new MediaRecorder();
        camera.unlock();
        mediaRecorder.setCamera(camera);
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
        mediaRecorder.setPreviewDisplay(holder.getSurface());
        mediaRecorder.setVideoFrameRate(29);
        mediaRecorder.setVideoSize(ByteArraysForLogin.VideoDimention.vWidth,ByteArraysForLogin.VideoDimention.vHeight);
        return mediaRecorder;
    }

    private int findBackFacingCamera() {
        int cameraId = -1;
        // Search for the back facing camera
        int numberOfCameras = Camera.getNumberOfCameras();
        for (int i = 0; i < numberOfCameras; i++) {
            CameraInfo info = new CameraInfo();
            Camera.getCameraInfo(i, info);
            if (info.facing == CameraInfo.CAMERA_FACING_BACK) {
                cameraId = i;
                break;
            }
        }
        return cameraId;
    }
}

以上code正常工作,但它显示的相机preVIEW在两个景观和放拉伸格式;人像模式如下图所示。

Above code works fine but it shows camera preview in stretched format in both landscape & portrait mode as following image.

  

然而,resultan摄像机图像不是拉伸它在仅preVIEW被拉伸正常模式。

However the resultan camera image is not stretched it is in normal mode only preview is stretched.

P.S。我问这个问题,试图这个

P.S. I am asking this question after trying this

推荐答案

尝试添加

getWindow().setFormat(PixelFormat.UNKNOWN);

在您的onCreate

in your onCreate

如果没有帮助,也许设置旋转将?

if that doesn't help maybe setting the rotation will?

camera.setDisplayOrientation(90);

如果仍然没有帮助,对谷歌所有的结果都这么说了SurfaceView的长宽比必须将照相机的纵横比相匹配

and if that still doesn't help, all the results on Google are saying the aspect ratio of the SurfaceView must match the aspect ratio of the camera