之前用MediaRecorder类实现了简单的录音demo,它还有录像功能,如下是一个简单的录像实现过程,
实现步骤跟录音录音大致一样,在此温习一遍:
第一步:实例化对象:mRecord = new MediaRecorder();
第二步:设置输入源:
1、音频输入源:mRecord.setAudioSource(MediaRecorder.AudioSource.MIC);
2、视频输入源:mRecord.setVideoSource(MediaRecorder.VideoSource.CAMERA);
第三步:设置输出格式:mRecord.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
第四步:设置编码方式:
1、音频编码:mRecord.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
2、视频编码:mRecord.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
第五步:设置音频写入的文件:mRecord.setOutFile(*);
第六步:准备:mRecord.prepare();
第七步:开始录像:mRecord.start();
第八步:停止录像:mRecord.stop(),然后再记得释放资源mRecord.release();
具体实现代码如下:
public class MyVideoRecordActivity extends Activity
{
/** Called when the activity is first created. */
MediaRecorder mRecord;
SurfaceView sView;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initWidget();
}
private void initWidget()
{
// TODO Auto-generated method stub
Button play = (Button) findViewById(R.id.start);
play.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
if (mRecord == null)
{
boolean result = startRecord();
if (!result)
{
stopRecord();
}
}
}
});
Button stop = (Button) findViewById(R.id.stop);
stop.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
stopRecord();
}
});
sView = (SurfaceView) findViewById(R.id.surfaceView1);
/*设置SurfaceView不需要自己维护缓冲区 */
sView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
/*设置视频分辨率 */
sView.getHolder().setFixedSize(320, 240);
/*设置不自动屏保 */
sView.getHolder().setKeepScreenOn(true);
}
private void stopRecord()
{
if (mRecord != null)
{
mRecord.stop();
mRecord.release();
mRecord = null;
}
}
private boolean startRecord()
{
/* 实例化对象 */
mRecord = new MediaRecorder();
/* 设置音频输入源 */
mRecord.setAudioSource(MediaRecorder.AudioSource.MIC);
/* 设置视频输入源 */
mRecord.setVideoSource(MediaRecorder.VideoSource.CAMERA);
/* 设置音频输出格式 */
mRecord.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
/* 设置音频编码方式 */
mRecord.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
/* 设置视频编码方式 */
mRecord.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
// mRecord.setVideoSize(320, 240);
// mRecord.setVideoFrameRate(5);
/* 设置音频写入的文件 */
File file = createFile(".mp4");
mRecord.setOutputFile(file.getAbsolutePath());
mRecord.setPreviewDisplay(sView.getHolder().getSurface());
// mRecord.setOrientationHint(90);
/* 准备录音频 */
try
{
mRecord.prepare();
}
catch (IllegalStateException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
/* 开始录像 */
System.out.println("mRecord.start()");
mRecord.start();
return true;
}
/* 创建指定后缀名的文件 */
private File createFile(String suffix)
{
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) { return null; }
File sdcardDir = Environment.getExternalStorageDirectory();
Time t = new Time();
t.setToNow();
String filename = null;
try
{
filename = sdcardDir.getCanonicalPath()
+ String.format("/MediaRecordTest%04d%02d%02d%02d%02d%02d"
+ suffix, t.year, t.month + 1, t.monthDay, t.hour,
t.minute, t.second);
}
catch (IOException e)
{
e.printStackTrace();
return null;
}
File file = new File(filename);
if (!file.exists())
{
try
{
file.createNewFile();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return file;
}
/* 创建底部退出菜单 */
public boolean onCreateOptionsMenu(Menu menu)
{
super.onCreateOptionsMenu(menu);
MenuItem item = menu.add(Menu.NONE, Menu.NONE, Menu.NONE, "Exit");
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener()
{
public boolean onMenuItemClick(MenuItem item)
{
stopRecord();
System.exit(0);
return true;
}
});
return true;
}
}
附上demo: