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"/>