您的位置:首页 > 移动开发 > Android开发

Android调用系统摄像头--使用MediaRecorder--2--使用MediaRecorder进行录制

2013-02-16 11:21 645 查看
准备好了预览(preview)之后,就可以使用MediaRecorder进行视频录制了,付上录制部分的代码

[java] view
plaincopyprint?

public class AndroidCameraActivity extends Activity {

private static final String TAG = "TAG-AndroidCameraActivity";

public static final int MEDIA_TYPE_IMAGE = 1;

public static final int MEDIA_TYPE_VIDEO = 2;

private Camera mCamera;

private CameraPreview mPreview;

private Button captureButton;

private MediaRecorder mMediaRecorder;

private boolean isRecording = false;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

// 创建Camera实例

mCamera = getCameraInstance();

// 创建Preview view并将其设为activity中的内容

mPreview = new CameraPreview(this, mCamera);

FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);

preview.addView(mPreview);

// 为Capture按钮加入listener,拍摄视频

captureButton = (Button) findViewById(R.id.button_capture);

captureButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if (isRecording) {

// 停止录像,释放camera

mMediaRecorder.stop();

releaseMediaRecorder();

mCamera.lock();

// 通知用户录像已停止

captureButton.setText("开始录像");

isRecording = false;

} else {

// 初始化视频camera

if (prepareVideoRecorder()) {

mMediaRecorder.start();

// 通知用户录像已开始

captureButton.setText("停止录像");

isRecording = true;

} else {

// 准备未能完成,释放camera

releaseMediaRecorder();

}

}

}

});

}

@Override

protected void onPause() {

super.onPause();

// 如果正在使用MediaRecorder,首先需要释放它。

releaseMediaRecorder();

// 在暂停事件中立即释放摄像头

releaseCamera();

}

private void releaseMediaRecorder() {

if (mMediaRecorder != null) {

// 清除recorder配置

mMediaRecorder.reset();

// 释放recorder对象

mMediaRecorder.release();

mMediaRecorder = null;

// 为后续使用锁定摄像头

mCamera.lock();

}

}

private void releaseCamera() {

if (mCamera != null) {

// 为其它应用释放摄像头

mCamera.release();

mCamera = null;

}

}

private boolean prepareVideoRecorder() {

mMediaRecorder = new MediaRecorder();

// 第1步:解锁并将摄像头指向MediaRecorder

mCamera.unlock();

mMediaRecorder.setCamera(mCamera);

// 第2步:指定源

mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);

mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

// 第3步:指定CamcorderProfile(需要API Level 8以上版本)

// mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

// 第3步:设置输出格式和编码格式(针对低于API Level 8版本)

mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

// 第4步:指定输出文件

mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());

// 第5步:指定预览输出

mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());

// 第6步:根据以上配置准备MediaRecorder

try {

mMediaRecorder.prepare();

} catch (IllegalStateException e) {

Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());

releaseMediaRecorder();

return false;

} catch (IOException e) {

Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());

releaseMediaRecorder();

return false;

}

return true;

}

private Camera getCameraInstance(){

Camera c = null;

try {

// 获取Camera实例

c = Camera.open();

} catch (Exception e){

// 摄像头不可用(正被占用或不存在)

}

// 不可用则返回null

return c;

}

private File getOutputMediaFile(int type) {

// ......生成媒体文件,如xxx.mp4......

}

private boolean checkCameraHardware(Context context) {

if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){

// 摄像头存在

return true;

} else {

// 摄像头不存在

return false;

}

}

}

根据Android官方文档,在使用MediaRecorder进行视频录制的时候一定要严格遵循上面的顺序,否则会报错

在API里到处是“if it is called before setOutputFormat() or after prepare() ”因此一定要严格的按照顺序来进行摄像头操作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: