【问题标题】:Custom Camera preview distorted自定义相机预览失真
【发布时间】:2018-05-30 10:53:14
【问题描述】:

我正在创建一个自定义相机,以便我的应用可以拍摄指定尺寸 (640 x 480) 或至少接近指定尺寸的视频。为此,我尝试在 onCreate 中获取支持的视频大小,如下所示:

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);
 }

然后,我在设置相机时使用尺寸:

 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;
}

这会正确录制视频,但预览会被拉伸。我也试过设置

 parameters.setPreviewSize(size.width, size.height);

在 surfaceChanged() 方法中。

【问题讨论】:

    标签: android camera


    【解决方案1】:

    为了摆脱这种情况,我只是建议你使用一个库,通过这个library

    【讨论】:

    • 谢谢!我会试一试,让你知道发生了什么。
    • 所以,我试了一下——它真的很容易使用和设置——但是,我仍然发现生成的视频有点失真:(我会多玩一点...... .
    • 如果我使用不同的设备,那么这个库似乎可以工作!
    • 您还应该在这个库中看到中心裁剪功能。为了在所有设备上正常工作。
    【解决方案2】:

    好的!我找到了答案,但对于我的一生 - 我找不到我从中复制它的 stackoverflow 帖子。基本上,视图在我的表面视图上被拉伸了,所以我不得不调整布局的大小以确保它不会拉伸。

    代码如下:

    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);
    }
    

    其中给定的宽度和高度是您正在使用的分辨率(在我的情况下约为 640 x 480)。确定要使用的分辨率后,我在 OnCreate 方法中调用此方法。

    【讨论】:

    猜你喜欢
    • 2015-11-22
    • 2023-04-03
    • 1970-01-01
    • 2016-02-18
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多