我在MediaRecorder
中使用SurfaceView
录制视频,一旦完成录制,我会转到另一个活动预览视频。我希望视频捕捉完全适合设备屏幕
我在准备录音机时试图设置视频大小:
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
height = displayMetrics.heightPixels;
width = displayMetrics.widthPixels;
//# Video settings
mRecorder.setVideoSize(width,height);
我也在surfaceCreated()中设置了camera参数:
mCamera = Camera.open();
Camera.Parameters parameters;
parameters = mCamera.getParameters();
parameters.setPreviewSize(width,height);
mCamera.setParameters(parameters);
完成录制后,我会将捕获的视频传递给其他活动,并设置为VideoView
,VideoView
布局已经设置为MATCH_PARENT
宽度和高度。
videoPreview = (VideoView)findViewById(R.id.videoPreview);
videoPreview.setVideoURI(videoUri);
videoPreview.start();
虽然我设置了视频大小和摄像头参数,但视频拍摄仍然没有设备屏幕那么大。我使用Pixel XL仿真器,宽度适合屏幕,但高度只有屏幕的一半。 / p>
所以我的问题是,如何使用MediaRecorder
捕获完全适合每个屏幕宽度和高度的视频?
答案 0 :(得分:0)
这是我用屏幕调整视频的方法:
当相机的init参数执行此代码时:
Camera.Parameters params = mCamera.getParameters();
preferredSize = params.getPreferredPreviewSizeForVideo();
adaptPrefferedVideoSize(params);
params.setPreviewSize(preferredSize.width, preferredSize.height);
adjustVideoSurface(screenWidth, screenHeight,preferredSize.width, preferredSize.height, surfaceView);
//...
这就是adaptPrefferedVideoSize方法:
public void adaptPrefferedVideoSize(Camera.Parameters params) {
Camera.Size sizeW640 = params.getPreviewSize();
Camera.Size sizeW720 = params.getPreviewSize();
Camera.Size sizeW1280 = params.getPreviewSize();
sizeW640.width = 640;
sizeW640.height = 480;
sizeW720.width = 720;
sizeW720.height = 480;
sizeW1280.width = 1280;
sizeW1280.height = 720;
preferredSize = sizeW1280;
/*************************/
if (params.getSupportedVideoSizes() != null) {
if (params.getSupportedVideoSizes().contains(sizeW1280)) {
preferredSize = sizeW1280;
} else if (params.getSupportedVideoSizes().contains(sizeW720)) {
preferredSize = sizeW720;
} else {
preferredSize = sizeW640;
}
} else if (preferredSize != null) {
if (preferredSize.width > sizeW1280.width) {
preferredSize = sizeW1280;
} else if (!preferredSize.equals(sizeW720)) {
preferredSize = sizeW640;
}
} else {
preferredSize = sizeW640;
}
}
这是adjustVideoSurface方法:
public static boolean adjustVideoSurface(int screenWidth,
int screenHeight,
int width,
int height,
SurfaceView surfaceView) {
int preferredWidth = (width < height) ? width : height;
int preferredHeight = (width < height) ? height : width;
float ratioW = (float) screenWidth / preferredWidth;
float ratioH = (float) screenHeight / preferredHeight;
RelativeLayout.LayoutParams layoutParams;
int displayedHeight = (int) (ratioW * preferredHeight);
int displayedWidth = (int) (ratioH * preferredWidth);
layoutParams = new RelativeLayout.LayoutParams(screenWidth, displayedHeight);
if (displayedHeight > screenHeight) {
layoutParams = new RelativeLayout.LayoutParams(displayedWidth, screenHeight);
}
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
surfaceView.setLayoutParams(layoutParams);
surfaceView.requestLayout();
return Math.round(ratioH - ratioW) == 0;
}
我希望这个可以帮到你。
答案 1 :(得分:0)
所以我的问题是,如何使用MediaRecorder捕获完全适合每个屏幕宽度和高度的视频?
这是不可能的。
首先,不要求设备的摄像机支持的分辨率等于屏幕的物理分辨率。
其次,您的UI可能无法全屏占用(例如,存在于自由形式多窗口设备的浮动窗口中)。