Android的MediaRecorder除了可以用于录制音频之外,还可以用于录制视频。现在网上有很多demo是关于这方面的,但是本屌在参考学习的时候发现,这些demo大多数都是横屏的,换句话说就是竖屏录制视频的时候预览图像的方向旋转了90度。本屌在参阅部分资料并参考了几个demo之后,在自己的项目中解决了这个问题,下面给大家分享一下。
start.setOnClickListener(new OnClickListener() {
@SuppressLint("NewApi")
public void onClick(View v) {
// TODO Auto-generated method stub
try
{
mRecorder=new MediaRecorder();
mRecorder.reset();
//设置摄像头以及摄像头的方向
int CammeraIndex=FindBackCamera();//网上参考的一个函数,用来获取后置摄像头的info
mCamera=Camera.open(CammeraIndex);
mCamera.setDisplayOrientation(90);
mCamera.unlock();
mRecorder.setCamera(mCamera);
//设置从麦克风采集声音
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置从摄像头采集图像
mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
//设置视频文件的输出格式
//必须在设置声音编码格式、图像编码格式之前设置
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
//设置声音编码格式
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
//设置图像编码格式
mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
//mRecorder.setVideoSize(320, 280);
//每秒4帧
//mRecorder.setVideoFrameRate(4);
mRecorder.setOutputFile(Environment.getExternalStorageDirectory()+"/myvideo.mp4");
//设置录制视频的方向
mRecorder.setOrientationHint(90);
//指定使用SurfaceView来预览视频
mRecorder.setPreviewDisplay(sView.getHolder().getSurface());
mRecorder.prepare();
//开始录制
mRecorder.start();
System.out.println("---开始录制---");
Toast.makeText(getApplicationContext(), "开始", Toast.LENGTH_SHORT).show();
//让start按钮不可用
start.setEnabled(false);
//让stop按钮可用
stop.setEnabled(true);
isRecording=true;
}
catch(Exception e)
{
e.printStackTrace();
}
}
});
其中的
mCamera.setDisplayOrientation(90);
就是修改摄像头方向的代码,而
mRecorder.setOrientationHint(90);
这句是调整录制视频时的方向。简单解释一下就是,如果你将camera的方向设为90,而将mediarecorder的方向设为270,那么你在录制视频时预览方向是竖屏的,但是当你录好视频播放时,就会发现视频实际上是倒着的。
另附写得不好的xml文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/takevideo"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_alignParentBottom="true">
<Button
android:id="@+id/takestop"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:gravity="center"
android:text="停止"
android:textSize="20sp"/>
<Button
android:id="@+id/takestart"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:gravity="center"
android:text="开始"
android:textSize="20sp"/>
<Button
android:id="@+id/takecancel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:gravity="center"
android:text="取消"
android:textSize="20sp"/>
</LinearLayout>
<SurfaceView
android:id="@+id/video"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@id/takevideo"/>
</RelativeLayout>
以及获取摄像头信息的函数(感谢网上某大神的demo,具体是谁忘了,在此谢过!)
@SuppressLint("NewApi")
private int FindFrontCamera(){
int cameraCount = 0;
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
cameraCount = Camera.getNumberOfCameras(); // get cameras number
for ( int camIdx = 0; camIdx < cameraCount;camIdx++ ) {
Camera.getCameraInfo( camIdx, cameraInfo ); // get camerainfo
if ( cameraInfo.facing ==Camera.CameraInfo.CAMERA_FACING_FRONT ) {
// 代表摄像头的方位,目前有定义值两个分别为CAMERA_FACING_FRONT前置和CAMERA_FACING_BACK后置
return camIdx;
}
}
return -1;
}
//判断后置摄像头是否存在
@SuppressLint("NewApi")
private int FindBackCamera(){
int cameraCount = 0;
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
cameraCount = Camera.getNumberOfCameras(); // get cameras number
for ( int camIdx = 0; camIdx < cameraCount;camIdx++ ) {
Camera.getCameraInfo( camIdx, cameraInfo ); // get camerainfo
if ( cameraInfo.facing ==Camera.CameraInfo.CAMERA_FACING_BACK ) {
// 代表摄像头的方位,目前有定义值两个分别为CAMERA_FACING_FRONT前置和CAMERA_FACING_BACK后置
return camIdx;
}
}
return -1;
}
别忘了在manifest中添加权限
<!-- 录制音频 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!-- 使用摄像头 -->
<uses-permission android:name="android.permission.CAMERA"/>
<!-- -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 外部存储器 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>