Android 在视频录制预览中保持纵横比
我正在录制我的android项目的视频。 我使用它来配置MediaRecorderAndroid 在视频录制预览中保持纵横比,android,mediarecorder,Android,Mediarecorder,我正在录制我的android项目的视频。 我使用它来配置MediaRecorder private boolean prepareVideoRecorder(){ // BEGIN_INCLUDE (configure_preview) mCamera = CameraHelper.getDefaultCameraInstance(); // We need to make sure that our preview and recording video size a
private boolean prepareVideoRecorder(){
// BEGIN_INCLUDE (configure_preview)
mCamera = CameraHelper.getDefaultCameraInstance();
// We need to make sure that our preview and recording video size are supported by the
// camera. Query camera to find all the sizes and choose the optimal size given the
// dimensions of our preview surface.
Camera.Parameters parameters = mCamera.getParameters();
List<Camera.Size> mSupportedPreviewSizes = parameters.getSupportedPreviewSizes();
Camera.Size optimalSize = CameraHelper.getOptimalPreviewSize(mSupportedPreviewSizes,
mSurfaceView.getWidth(), mSurfaceView.getHeight());
// Use the same size for recording profile.
CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
profile.videoFrameWidth = optimalSize.width;
profile.videoFrameHeight = optimalSize.height;
// likewise for the camera object itself.
parameters.setPreviewSize(profile.videoFrameWidth, profile.videoFrameHeight);
mCamera.setParameters(parameters);
try {
// Requires API level 11+, For backward compatibility use {@link setPreviewDisplay}
// with {@link SurfaceView}
mCamera.setPreviewDisplay(mSurfaceView.getHolder());
mCamera.setDisplayOrientation(90);
} catch (IOException e) {
Log.e(TAG, "Surface texture is unavailable or unsuitable" + e.getMessage());
return false;
}
// END_INCLUDE (configure_preview)
// BEGIN_INCLUDE (configure_media_recorder)
mMediaRecorder = new MediaRecorder();
// Step 1: Unlock and set camera to MediaRecorder
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
// Step 2: Set sources
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC );
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
mMediaRecorder.setProfile(profile);
// Step 4: Set output file
String path = getVideoFile(MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO).getAbsolutePath();
currentFile = path;
mMediaRecorder.setOutputFile(path);
mMediaRecorder.setOrientationHint(270);
// END_INCLUDE (configure_media_recorder)
// Step 5: Prepare configured MediaRecorder
try {
mMediaRecorder.prepare();
} catch (IllegalStateException e) {
Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
releaseMediaRecorder();
return false;
} catch (IOException e) {
Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
releaseMediaRecorder();
return false;
}
return true;
}
private boolean prepareVideoRecorder(){
//开始包含(配置预览)
mCamera=CameraHelper.getDefaultCameraInstance();
//我们需要确保我们的预览和录制视频大小得到
//摄像头。查询摄像头以查找所有尺寸,并选择给定的最佳尺寸
//预览曲面的尺寸。
Camera.Parameters=mCamera.getParameters();
List mSupportedPreviewSizes=参数。getSupportedPreviewSizes();
Camera.Size optimizesize=CameraHelper.getoptimizepreviewsize(mSupportedPreviewSizes,
mSurfaceView.getWidth(),mSurfaceView.getHeight();
//使用相同的大小录制配置文件。
CamcorderProfile profile=CamcorderProfile.get(CamcorderProfile.QUALITY\u HIGH);
profile.videoFrameWidth=最佳尺寸.width;
profile.videoFrameHeight=最佳尺寸.height;
//对于摄影机对象本身也是如此。
parameters.setPreviewSize(profile.videoFrameWidth、profile.videoFrameHeight);
mCamera.setParameters(参数);
试一试{
//需要API级别11+,为了向后兼容,请使用{@link setPreviewDisplay}
//使用{@link SurfaceView}
setPreviewDisplay(mSurfaceView.getHolder());
mCamera.setDisplayOrientation(90);
}捕获(IOE异常){
Log.e(标记“表面纹理不可用或不合适”+e.getMessage());
返回false;
}
//结束包含(配置预览)
//开始包括(配置媒体记录器)
mMediaRecorder=新的MediaRecorder();
//步骤1:解锁摄像头并将其设置为MediaRecorder
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
//步骤2:设置源
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
//步骤3:设置摄像机配置文件(需要API级别8或更高)
mMediaRecorder.setProfile(配置文件);
//步骤4:设置输出文件
字符串路径=getVideoFile(MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO).getAbsolutePath();
currentFile=路径;
mMediaRecorder.setOutputFile(路径);
mMediaRecorder.setOrientationHint(270);
//结束\u包括(配置\u媒体\u记录器)
//步骤5:准备已配置的MediaRecorder
试一试{
mMediaRecorder.prepare();
}捕获(非法状态){
Log.d(标记“IllegalStateException准备MediaRecorder:”+e.getMessage());
释放MediaRecorder();
返回false;
}捕获(IOE异常){
Log.d(标记“IOException准备MediaRecorder:+e.getMessage());
释放MediaRecorder();
返回false;
}
返回true;
}
在我的xaml中,我有一个SurfaceView
... <RelativeLayout
android:id="@+id/videoSurfaceParent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/carouselBar"
android:background="@android:color/black"
android:visibility="invisible">
<SurfaceView
android:id="@+id/videoSurface"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerHorizontal="true"
android:visibility="invisible">
</SurfaceView>
</RelativeLayout>...
。。。
...
我的问题是,当我录制视频时,预览被拉伸,人们看起来像是很胖
有没有办法保持纵横比?我用的是前置摄像头