我正在创建一个自定义摄像头,这样我的应用程序就可以拍摄指定大小(640x480)的视频,或者至少接近指定大小。为此,我尝试在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()方法中。
发布于 2018-05-30 19:43:25
为了摆脱这种情况,我会简单地建议你使用一个库,通过这个library
发布于 2018-05-31 20:29:44
好的!我找到了答案,但无论如何我都找不到我复制它的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);
}
其中给定的宽度和高度是您使用的分辨率的宽度和高度(在我的示例中为~640x480),在确定要使用的分辨率后,.I在我的OnCreate方法中调用此方法。
https://stackoverflow.com/questions/50602834
复制相似问题