MediaRecorder ,一般用在多媒体视频录制上面,今天我们就来聊聊视频录制,首先录制视频我们少不了要用Camera,
1、SurfaceView 用于承载画面
这里我们需要首先是implements SurfaceHolder.Callback,这样我们才能在surface创建的时候初始化相机渲染画面, 在画面销毁的时候销毁相机
2、初始化相机Camera
3、 初始化震动传感器监听 用于录制视频
4、SoundPool 用于开始录像时播放的声音
5、配置MediaRecorder 的录制参数后开始录制
6、停止录像
MainActivity.class
package com.testopensourceapplication.recorderdemo; import android.content.Context; import android.content.Intent; import android.content.res.ColorStateList; import android.content.res.Configuration; import android.graphics.Color; import android.hardware.Camera; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.media.AudioManager; import android.media.CamcorderProfile; import android.media.MediaRecorder; import android.media.SoundPool; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.List; public class MainActivity extends AppCompatActivity implements View.OnClickListener ,SurfaceHolder.Callback{ public static CustomProgressDialog progressDialog; SurfaceView surfaceView; TextView timer; ImageView recording; LinearLayout ll_hud_record_viewc; TextView start; TextView save; TextView photo; TextView stop; private String innerSDcard;// 储存内部SD卡路径 public static String rootpath; private String extSDcard;// 储存外部SD卡的路径(需要root权限) private MediaRecorder mediaRecorder;// 录制视频的类 private SensorManager sensorManager;// 检测震动相关对象(加速度传感器) private final int MENU_HIDE_MSG = 0x001; private final int TIMER_GOING_MSG = 0x002; private final int RECORDER_RESTART_MSG = 0x003; private final int LAUNCH_RECORD = 0x004; private int textColor; private boolean isRecording = false; private String nowTime; private int second; private int minute; private int hour; private Camera mCamera; private SurfaceHolder surfaceHolder; private Camera.Size previewSize; private boolean safeToTakePicture = false; private SoundPool soundPool; private int cameraSound;// 音效的ID /** * 定时器设置,实现计时 */ private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == TIMER_GOING_MSG) { handler.sendEmptyMessageDelayed(TIMER_GOING_MSG, 1000); second++; if (second >= 60) { minute++; second = second % 60; } if (minute >= 60) { hour++; minute = minute % 60; } timer.setText(RecordUtils.format(hour) + ":" + RecordUtils.format(minute) + ":" + RecordUtils.format(second)); } if (msg.what == RECORDER_RESTART_MSG) { prepareRecorder(); } if (msg.what == MENU_HIDE_MSG) { start.setVisibility(View.GONE); stop.setVisibility(View.GONE); save.setVisibility(View.GONE); photo.setVisibility(View.GONE); } if (msg.what == LAUNCH_RECORD) { RecordUtils.spaceNotEnoughDeleteTempFile(MainActivity.this, rootpath); if (mediaRecorder == null) { prepareRecorder(); } else { Toast.makeText(MainActivity.this, "视频录制中", Toast.LENGTH_SHORT) .show(); } } super.handleMessage(msg); } }; //拍照的回调 Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { String path = innerSDcard + "/infisight/Recorders/photo/"; File photoFile = new File(path); if(!photoFile.exists()){ photoFile.mkdirs(); } if (isRecording == false) { mCamera.stopPreview(); } File pictureFile =new File(path,System.currentTimeMillis()+".jpg"); try{ FileOutputStream fos =new FileOutputStream(pictureFile); fos.write(data); fos.close(); }catch (Exception e){ Log.d("takePhoto", "File not found: " + e.getMessage()); } safeToTakePicture = true; if (isRecording == false) { mCamera.startPreview(); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initActivity(); } private void initView(){ // SurfaceView 用于承载画面 surfaceView = (SurfaceView) findViewById(R.id.surfaceview); timer = (TextView) findViewById(R.id.timer); recording = (ImageView) findViewById(R.id.recording); ll_hud_record_viewc = (LinearLayout) findViewById(R.id.ll_hud_record_view); start = (TextView) findViewById(R.id.start); save = (TextView) findViewById(R.id.save); photo = (TextView) findViewById(R.id.photo); stop = (TextView) findViewById(R.id.stop); SurfaceHolder holder = surfaceView.getHolder();// 取得holder holder.addCallback(this); // holder加入回调接口 // 用于开始录像时播放的声音 音效的数量,类型,质量 soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0); //加载声音资源 cameraSound =