使用 Camera 录制视频, 实现步骤如下:
需要权限: android.permission.CAMERA
android.permission.RECORD_AUDIO
android.permission.WRITE_EXTERNAL_STORAGE
如果录制前后需要预览效果, 需要在录制开始前停止预览, 并解锁摄像头.
录制停止后锁上摄像头, 再开始预览.
MediaRecorder mMediaRecorder = new MediaRecorder();
mMediaRecorder.setCamera(camera);// 关联摄像头
mMediaRecorder.setAudioSource(AudioSource.CAMCORDER);// 设置音频源
mMediaRecorder.setVideoSource(VideoSource.CAMERA);// 设置视频源
CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW);// 获得摄像质量低的配置
mMediaRecorder.setProfile(profile);// 设置配置文件
mMediaRecorder.setOutputFile(“/mnt/sdcard/test.mp4”);// 设置输出文件.
mMediaRecorder.setPreviewDisplay(mHolder.getSurface());// 设置预览显示
mMediaRecorder.prepare();// 准备
mMediaRecorder.start();// 录制
mMediaRecorder.stop();// 停止
mMediaRecorder.release();// 释放资源
public class MainActivity extends Activity implements Callback {
private Camera camera;
private SurfaceHolder mHolder;
private MediaRecorder mMediaRecorder;
private boolean isCapturing = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surfaceview);
mHolder = surfaceView.getHolder();
// 设置数据来源自外部, 不维护自己内部的缓冲区, 而是等待渲染引擎把数据推送到界面上.
// 注意: 4.0以前版本必须要设置, 4.0以后版本自动会设置.
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mHolder.addCallback(this); }
public void capture(View v) {
if(!isCapturing) {
isCapturing = true;
camera.stopPreview();
camera.unlock();
mMediaRecorder = new MediaRecorder();
mMediaRecorder.setCamera(camera);
mMediaRecorder.setAudioSource(AudioSource.CAMCORDER);
mMediaRecorder.setVideoSource(VideoSource.CAMERA);
CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW);
mMediaRecorder.setProfile(profile);
File sdcardFile = Environment.getExternalStorageDirectory();
String path = new File(sdcardFile, "video" + System.currentTimeMillis() + ".mp4").getPath();
mMediaRecorder.setOutputFile(path);
mMediaRecorder.setPreviewDisplay(mHolder.getSurface());
try {
mMediaRecorder.prepare();
mMediaRecorder.start();
} catch (Exception e) { e.printStackTrace();
}
} else {
isCapturing = false;
mMediaRecorder.stop();
mMediaRecorder.release();
mMediaRecorder = null;
camera.lock();
camera.startPreview();
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) { try {
camera = Camera.open();
camera.setPreviewDisplay(mHolder);
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
} @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
camera.release();
camera = null;
}
}