如何设置MediaRecorder的视频大小以完美填充设备屏幕的宽度和高度?在SurfaceView
使用MediaRecorder
我录像,一旦做记录,我传递给另一个活动预览video.I想要的视频拍摄是完全适合手机屏幕如何设置MediaRecorder的视频大小以完美填充设备屏幕的宽度和高度?在<code>SurfaceView</code>使用<code>MediaRecorder</code>
我试图设置视频大小时,准备记录:
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
height = displayMetrics.heightPixels;
width = displayMetrics.widthPixels;
//# Video settings
mRecorder.setVideoSize(width,height);
我还设置在surfaceCreated()相机参数,以及:
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();
虽然我设置视频的大小和摄像头的参数,但视频拍摄还没有那样大的使用像素XL模拟器设备screen.I,宽度适合屏幕,但身高只有一半屏幕。
所以我的问题是,如何捕捉一个视频,将完全适合每个屏幕的宽度和高度使用MediaRecorder
?
这是我的方法与屏幕,以适应视频:
当相机的初始化参数做到这一点代码:
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;
}
我希望这个coul能帮助你。
所以我的问题是,如何捕捉一个视频,将完全适合每个屏幕的宽度和高度使用MediaRecorder?
这是不可能的。
首先,不要求设备的相机支持与屏幕物理分辨率相同的分辨率。其次,您的用户界面可能无法占用整个屏幕(例如,存在于自由形式的多窗口设备中的浮动窗口中)。
我的意思是在SurfaceView中捕获一个具有相同高度和宽度的视频,并在SurfaceView中进行预览。在SurfaceView中,视频显示的宽度和高度与SurfaceView完全相同。顺便说一下我的SurfaceView是match_parent ..有可能做到这一点? – ken
@ CommonsWare。嗨,你能帮我解答我的问题吗? https://stackoverflow.com/q/46790086/4813855非常感谢 –
@ken:“我的意思是在SurfaceView中预览同样高度和宽度的视频” - 这是不可能的。一个'SurfaceView'可以有任何分辨率;您的相机无法支持任意分辨率。 – CommonsWare
它是宽度和高度我自己陈述它?screenwidth和screenHeight是由displayMetric? – ken
这个方法'getPreferredPreviewSizeForVideo();'如何定义?你能说出来吗?谢谢 – ken
getPreferredPreviewSizeForVideo是Camera.Parameters中定义的一种方法。 是屏幕宽度和屏幕高度是由displayMetric 拍摄的,宽度和高度对应于上面提到的preferredSize.width和preferredSize.height。 –