为了将MediaRecorder用于视频捕获,必须采用与音频捕获相同的步骤,同时加上一些视频的特定的步骤。除此之外,MediaRecord是一个状态机,因此必须遵从实例化到录制的特定步骤序列。
  首先将实例化MediaRecorder,然后一次进行其他的步骤。

MediaRecorder recorder=new MediaRecorder();

1.音频和视频源
  在实例化后,可以设置音频和视频源,可以使用setAudioSource方法来设置音频源,并传入一个常量以表示想要使用的源。

recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);

  音频远的可能值定义在MediaRecorder.AudioSource类中的常量:
1)CAMCORDER:如果设备有不同的麦克风用于不同的摄像头(前摄、后摄),那么使用此值将指定适当的麦克风。API 7之后。
2)DEFAULT:这个值指定将使用设备上默认的麦克风。
3)MIC:这个值指定将使用用于录制视频的标准麦克风。
4)VOICE_CALL:之歌值指定音频应该是来自一个正在进行中的电话。虽然可能不是所有的手机,但是目前大部分的手机都不支持这个常量。
5)VOICE_DOWNLINK:这个值指定音频应该是来自一个电话,特别是指传入的音频。虽然可能不是所有的手机,但是目前大部分的手机都不支持这个常量。
6)VOICE_UPLINK: 这个值指定音频应该是来自一个电话,特别是指传出的音频(手机发送的音频)。虽然可能不是所有的手机,但是目前大部分的手机都不支持这个常量。
7)VOICE_RECOGNITION:这个值指定音频应该来自一个设置为用于电话上语音识别功能的麦克风。如果没有指定这种麦克风,那么将使用默认的麦克风。
  CAMERA和DEFAULT这两个常量表示同样的事情,即设备上的主摄像头应该用于录制视频。对于设置视频源,可以使用setVideoSource方法:

recorder. setVideoSource(MediaRecorder.AudioSource. DEFAULT);

2.输出格式
  在设置音频源和视频源之后,可以使用MediaRecorder的setOutputFormat方法设置输出格式,同时传入要使用的格式。

recorder. setOutputFormat (MediaRecorder. OutputFormat. DEFAULT);

  可能的格式定义为在MediaRecorder.OutputFormat类中列出的常量。
1)DEFAULT:指定使用默认的输出格式。默认的输出格式可能会根据设备的不同而有所区别。
2)MPEG_4:指定音频和视频将被捕获到一个MPEG_4文件格式的文件中。这个文件将是一个.MP4文件。MPEG_4文件通常包含H.264、H.263或MPEG_4 Part 2编码的视频,以及ACC或MP3编码的音频。MPEG_4被广泛的使用在各种在线视频技术以及消费电子设备中。
3)RAW_AMR:此设备仅用于音频录制,而不用于视频。
4)THREE_GPP:指定音频和视频将被捕获到一个3GP文件格式的文件中。这个文件将是一个.3GP文件。.3GP文件通常包含使用H.264、MPEG_4 Part 2和H.263编解码器编码的视频和使用AMR或AAC编解码编码的音频。
3.音频和视频编码器
  在设置输出格式后,应该指定想要使用的音频和视频编码器。使用MediaRecorder的setVideoEncoder方法,可以指定将要使用的视频编解码器。

recorder. setVideoEncoder (MediaRecorder. VideoEncoder. DEFAULT);

  可以传递给setVideoEncoder的可能值定义为在MediaRecorder. VideoEncoder中的常量:
1)DEFAULT:指定使用设备的默认编解码器。大多数情况下是H.263。
2)H263
3)H264
4) MPEG_4_SP
  使用MediaRecorder的setAudioEncoder方法,可以指定将要使用的音频编解码器。

recorder. setAudioEncoder (MediaRecorder. AudioEncoder. DEFAULT);

  可以传递给setAudioEncoder的可能值定义为在MediaRecorder. AudioEncoder中的常量。MediaRecorder. AudioEncoder仅包含两个常量:
1)AMR_NB
2)DEFAULT:其实该值也是上边的AMR_NB音频编解码器。
4.音频和视频比特率
  可以说使用MediaRecorder的setVideoEncodingBitrate方法设置视频编码比特率,并传入请求的比特率,以位/秒为单位。视频的低比特率设置在256000位/秒(256kbps)范围之内,而高比特率视频在3000000位/秒(3 m kbps)范围之内。

recorder.setVideoEncodingBitrate(150000);

还可以指定用来编码音频数据的最大比特率。

recorder.setAudioEncodingBitrate(8000);

5.音频采样率
  与比特率一样,音频采样率对于确定要捕获和编码的音频质量也非常重要。MediaPlayer有一个setAudioSampleRate方法,用于请求特定的采样率。传入的采样率以Hz为单位,其表示每秒采样的数量。采样率越高,则在捕获文件中可以表示的音频频率的范围越大。一个低端的采样率8 000Hz适用与捕获低质量的声音,高端的采样率48 000Hz可用于高质量的视频格式。

recorder.setAudioSampleRate (8000);

6.音频通道
通过使用setAudioChannels方法传入通道的数量来指定捕获的音频通道的数量。

recorder.setAudioChannels(1);

7.视频帧速率
  可以通过使用setVideoFrameRate并传入请求的帧速率来控制每秒钟补货的视频帧数。每秒12~15帧之间的值通常足以表示运动。对于高端而言,电视是每秒30帧。具体使用的实际帧数率将取决与设备的能力。

recorder.setVideoFrameRate(20);

8.视频大小
  可以通过使用setVideoSize方法传入表示宽度和高度像素的整数来控制捕获视频的宽度和高度。标准大小的范围是176*144~640*480,许多设备甚至支持更高的分辨率。

recorder. setVideoSize (640,480);

9.最大文件大小
  通过以字节为单位将最大大小传递给setMaxFileSize方法,可以指定由MediaRecorder所补货的文件的最大大小。

recorder.setMaxFileSize(10000000);//10M

  为了确定是否已经达到最大文件大小,需要在活动中来实现MediaRecorder.OnInfoListener。
  同时在MediaRecorder中注册,然后将会调用onInfo方法,根据MediaRecorder.MEDIA_RECORDER_INFO_FILESIZE_REACHED常量检查其中的what参数。如果它们匹配,那么说明达到了最大文件大小。
  不存在检查它是否已经停止的方法。为了实际停止录制,必须显式地调用stop方法。
  下面使用简单的代码说明:

public class VideoCapture extends Activity implements MediaRecorder.OnInfoListener{
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  mMediaRecorder.setOnInfoListener(this);
 }
 public void onInfo(MediaRecorder mr, int what, int  extra) {
 if(what==MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILE SIZE_REACHED){
  Log.v("VIDEOCAPTURE", "Maximum Filesize Reached");
  mMediaRecorder.stop();
 }
}

10.最长持续时间
  通过以毫秒为单位将最长持续时间传递给setMaxDuration方法,可以指定MediaRecorder所捕获的文件的最长持续时间。

recorder.setMaxDuration(100);//100秒

  为了确定是否已经达到了最长持续时间,需要在活动中实现MediaRecorder.OnInfoListener,同时在MediaRecorder中注册它。然而当已经达到最长持续时间就会出发onInfo方法,同时将what整数设置为常量MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED。
  MediaRecorder在达到最长持续时间停止,不存在检查它是否已经停止的方法。为了实际停止录制,必须显式地调用stop方法。
  下面使用简单的代码说明:

public class VideoCapture extends Activity implements MediaRecorder.OnInfoListener{
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  mMediaRecorder.setOnInfoListener(this);
 }
 public void onInfo(MediaRecorder mr, int what, int  extra) {
 if(what==MediaRecorder. MEDIA_RECORDER_INFO_MAX_
DURATION_REACHED){
  Log.v("VIDEOCAPTURE", "Maximum Duration Reached");
  mMediaRecorder.stop();
 }
}

11.统一设置
  从API level 8开始,MediaRecorder有一个setProfile方法,它接受一个CamcorderProfile实例作为参数。CamcorderProfile有一个静态方法CamcorderProfile.get,它接受一个整数参数,其可能的值定义为常量:CamcorderProfile.QUALITY_HIGH或CamcorderProfile.QUALITY_LOW。使用该方法可以将根据预设值设置整个配置变量集合。
  其中,QUALITY_HIGH是指高质量视频捕获设置,QUALITY_LOW是指低质量视频捕获设置。
  QUALITY_HIGH包含以下设置:
1)音频比特率:12 200位/秒
2)音频通道:1
3)音频编解码器:AMR-NB
4)音频采样率:8000Hz
5)持续时间:60s
6)文件格式:MP4
7)视频比特率:3 000 000位/秒
8)视频编解码器:H.264
9)视频帧宽度:720像素
10)视频帧高度:480像素
11)视频帧速率:24帧/秒
  QUALITY_LOW包含以下设置:
1)音频比特率:12 200位/秒
2)音频通道:1
3)音频编解码器:AMR-NB
4)音频采样率:8000Hz
5)持续时间:30s
6)文件格式:3GPP
7)视频比特率:256 000位/秒
8)视频编解码器:H.263
9)视频帧宽度:176像素
10)视频帧高度:144像素
11)视频帧速率:15帧/秒
12.输出文件
  紧随其后将设置输出文件的位置。可以传入一个FileDescriptor或一个表示文件路径的字符串。

recorder.setOutputFile(VecordFile.getAbsolutePath());

总结
  可以通过使用MediaRecorder类来创建获取捕获视频,通过上述的设置方法为MediaRecorder实例设置参数进行录制视频。