首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自定义相机预览失真

自定义相机预览失真
EN

Stack Overflow用户
提问于 2018-05-30 18:53:15
回答 2查看 385关注 0票数 0

我正在创建一个自定义摄像头,这样我的应用程序就可以拍摄指定大小(640x480)的视频,或者至少接近指定大小。为此,我尝试在onCreate中获取支持的视频大小,如下所示:

代码语言:javascript
运行
复制
useMe = null;
Camera.Parameters parameters = mCamera.getParameters();
List<Camera.Size> list = parameters.getSupportedVideoSizes();
for (int i = 0; i < list.size(); i++) {
   Camera.Size size = list.get(i);
   Log.i("SIZE: ", size.width + " " + size.height);
   if (size.width == 640) {
      useMe = size;
      break;
   }
   if (size.width < 640) {
      if ((i - 1) > 0) {
         useMe = list.get(i-1);
      } else {
         useMe = size;
      }
   }
 }
 if (useMe == null) {
   useMe = list.get(list.size()/2);
 }

然后,我在设置相机时使用大小:

代码语言:javascript
运行
复制
 private boolean prepareVideoRecorder(){

    mCamera = getCameraInstance();
    mMediaRecorder = new MediaRecorder();

    Camera.Parameters p = mCamera.getParameters();
    p.setPreviewSize(useMe.width, useMe.height);
    mCamera.setParameters(p);

    // Step 1: Unlock and set camera to MediaRecorder
    mCamera.unlock();
    mMediaRecorder.setCamera(mCamera);

    // Step 2: Set sources
    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

    // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
    mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

    mMediaRecorder.setVideoSize(useMe.width, useMe.height);

    mMediaRecorder.setMaxDuration(10000);
    mMediaRecorder.setOnInfoListener(this);

    // Step 4: Set output file
    mMediaRecorder.setOutputFile(getOutputMediaFile().toString());

    // Step 5: Set the preview output

   mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());

    // Step 6: Prepare configured MediaRecorder
    try {
        mMediaRecorder.prepare();
    } catch (IllegalStateException e) {           
        releaseMediaRecorder();
        return false;
    } catch (IOException e) {
        releaseMediaRecorder();
        return false;
    }
    return true;
}

这会正确录制视频,但会拉伸预览。我还试着设置

代码语言:javascript
运行
复制
 parameters.setPreviewSize(size.width, size.height);

在surfaceChanged()方法中。

EN

回答 2

Stack Overflow用户

发布于 2018-05-30 19:43:25

为了摆脱这种情况,我会简单地建议你使用一个库,通过这个library

票数 1
EN

Stack Overflow用户

发布于 2018-05-31 20:29:44

好的!我找到了答案,但无论如何我都找不到我复制它的stackoverflow帖子了。基本上,视图是在我的表面视图上拉伸的,所以我必须调整布局的大小,以确保它不会拉伸。

代码如下:

代码语言:javascript
运行
复制
private void setMyPreviewSize(int width, int height) {
    // Get the set dimensions
    float newProportion = (float) width / (float) height;

    // Get the width of the screen
    int screenWidth = getWindowManager().getDefaultDisplay().getWidth();
    int screenHeight = getWindowManager().getDefaultDisplay().getHeight();
    float screenProportion = (float) screenWidth / (float) screenHeight;

    // Get the SurfaceView layout parameters
    android.view.ViewGroup.LayoutParams lp = mPreview.getLayoutParams();
    if (newProportion > screenProportion) {
        lp.width = screenWidth;
        lp.height = (int) ((float) screenWidth / newProportion );
    } else {
        lp.width = (int) (newProportion * (float) screenHeight);
        lp.height = screenHeight;
    }
    // Commit the layout parameters
    mPreview.setLayoutParams(lp);
}

其中给定的宽度和高度是您使用的分辨率的宽度和高度(在我的示例中为~640x480),在确定要使用的分辨率后,.I在我的OnCreate方法中调用此方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50602834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档