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