相机preVIEW是越来越捉襟见肘

编程入门 行业动态 更新时间:2024-10-24 19:15:37
本文介绍了相机preVIEW是越来越捉襟见肘的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我已经写了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="schemas.android/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

更多推荐

相机preVIEW是越来越捉襟见肘

本文发布于:2023-10-31 06:33:20,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1545301.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:捉襟见肘   相机   preVIEW

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!