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() ”因此一定要严格的按照顺序来进行摄像头操作
[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() ”因此一定要严格的按照顺序来进行摄像头操作
相关文章推荐
- Android调用系统摄像头--使用MediaRecorder--2--使用MediaRecorder进行录制
- Android调用系统摄像头--使用MediaRecorder--2--使用MediaRecorder进行录制
- Android调用系统摄像头--使用MediaRecorder--1--预览(preview)功能
- Android调用系统摄像头--使用MediaRecorder--1--预览(preview)功能
- 在APP当中调用Android系统摄像头进行视频录制
- Android多媒体——(MidiaRecorder音频录制/视频播放surface/Soundpool提示音/调用系统摄像头camera)
- Android 调用系统相机进行拍照 使用自带的图片选择器和裁剪工具
- Android 中使用MediaRecorder进行录像详解(视频录制) (转)
- Android 中使用MediaRecorder进行录像详解(视频录制)
- Android 中使用MediaRecorder进行录像详解(视频录制)
- android下摄像头的使用,非系统调用
- android开发之调用手机的摄像头使用MediaRecorder录像并播放
- Android 中使用MediaRecorder进行录像详解(视频录制)
- Android客户端之“微服私访”App的系统学习(八)调用系统摄像头拍照并管理照片并使用Okhttp上传文件至后台
- 调用Android系统摄像头进行拍照以及从图库选择图片
- Android 中使用MediaRecorder进行录像详解(视频录制)
- Android 中使用MediaRecorder进行录像详解(视频录制)
- Android 中使用MediaRecorder进行录像详解(视频录制)
- android中使用MediaRecorder进行视频录制笔记