您的位置:首页 > 其它

使用MediaRecorder进行视频录制

2016-07-20 13:40 369 查看
1.仅适用MediaRecorder进行录制,此种方式网上很多,就是不加camera实现。

2.使用MediaRecorder+camera进行录制,此种方式可能会出现问题,下面的代码经过在4.4以及5.1系统测试均没问题。

权限

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission
android:name="android.permission.RECORD_AUDIO">
</uses-permission>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE">
</uses-permission>

private Camera mCamera;
private SurfaceView mSurfaceView;
private SurfaceHolder mSurfaceHolder;
private CameraInfo[] mCameraInfo;
private Button startButton;
private boolean mIsRecording = false;
private MediaRecorder mediaRecorder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mSurfaceView = (SurfaceView)findViewById(R.id.surfaceview);
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.addCallback(new Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
releaseCamera();
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
initpreview();
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {

}
});
startButton = (Button)findViewById(R.id.start);
startButton.setOnClickListener(this);
}

protected void releaseCamera() {
if(mCamera!=null){
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}

protected void initpreview() {
mCamera = Camera.open(CameraInfo.CAMERA_FACING_BACK);
try {
mCamera.setPreviewDisplay(mSurfaceHolder);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
setCameraDisplayOrientation(this,CameraInfo.CAMERA_FACING_BACK,mCamera);
mCamera.startPreview();
}
public static void setCameraDisplayOrientation(Activity activity,
int cameraId, android.hardware.Camera camera) {
android.hardware.Camera.CameraInfo info =
new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(cameraId, info);
int rotation = activity.getWindowManager().getDefaultDisplay()
.getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0: degrees = 0; break;
case Surface.ROTATION_90: degrees = 90; break;
case Surface.ROTATION_180: degrees = 180; break;
case Surface.ROTATION_270: degrees = 270; break;
}

int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360;  // compensate the mirror
} else {  // back-facing
result = (info.orientation - degrees + 360) % 360;
}
camera.setDisplayOrientation(result);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public void onClick(View view) {
int id = view.getId();
switch (id) {
case R.id.start:

if(mIsRecording==false) {
startmediaRecorder();
}else{
stopmediaRecorder();
}
if(mIsRecording){
startButton.setText("stop");
}else{
startButton.setText("start");
}
break;
default:
break;
}

}

private void stopmediaRecorder() {
if(mediaRecorder!=null){
if(mIsRecording){
mediaRecorder.stop();
//mCamera.lock();
mediaRecorder.reset();
mediaRecorder.release();
mediaRecorder=null;
mIsRecording = false;
try {
mCamera.reconnect();
} catch (IOException e) {
Toast.makeText(this, "reconect fail", 0).show();
e.printStackTrace();
}
}
}
}

private void startmediaRecorder() {
mCamera.unlock();
mIsRecording = true;
mediaRecorder = new MediaRecorder();
mediaRecorder.reset();
mediaRecorder.setCamera(mCamera);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
CamcorderProfile mCamcorderProfile = CamcorderProfile.get(CameraInfo.CAMERA_FACING_BACK, CamcorderProfile.QUALITY_480P);
mediaRecorder.setProfile(mCamcorderProfile);
mediaRecorder.setVideoFrameRate(20);
String fileName = DateUtils.formatDate(new Date(), "yyyyMMddHHmmss");
File file = new File(Environment.getExternalStorageDirectory(), fileName + ".mp4");
mediaRecorder.setOutputFile(file.getAbsolutePath());
mediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());

try {
mediaRecorder.prepare();
} catch (Exception e) {

mIsRecording = false;
Toast.makeText(this, "fail", 0).show();
e.printStackTrace();
mCamera.lock();
}
mediaRecorder.start();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: