视频音频的录制和保存
1. 准备工作
配置权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 当前程序需要使用 照相机功能 -->
<uses-feature
android:name="android.hardware.camera"
android:required="true" />
<!-- 自定义相机的权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 录音和录像的权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 拍照录像 可以包含位置信息 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
2. 布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.leejoy.mediarecorder.ImplicitIntentVideoRecordActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="btnRecordVideoWithIIntent"
android:text="隐式意图录制视频" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="btnIntoSurfaceViedo"
android:text="使用Camera和SurfaceView录制视频"
/>
</LinearLayout>
3. Activity
public class ImplicitIntentVideoRecordActivity extends AppCompatActivity {
public static final int CAPTURE_VIDEO_REQUEST_CODE = 998;
private Uri fileUri;
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_implicit_intent_video_record);
intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
File dir = FileUtil.getMediaRecorderFolder(this);
File targetFile = new File(dir, "audio_video-" + System.currentTimeMillis() + ".mp4");
fileUri = Uri.fromFile(targetFile);
//录完直接保存文件 的动作 Action
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name
//设置高质量的视频
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // set the video image quality to high
}
public void btnRecordVideoWithIIntent(View view) {
startActivityForResult(intent, CAPTURE_VIDEO_REQUEST_CODE);
}
//接收Intent到达的Activity的返回的数据
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAPTURE_VIDEO_REQUEST_CODE){
if (resultCode == RESULT_OK){
// Video captured and saved to fileUri specified in the Intent
Toast.makeText(this, "Video saved to:\n" +
data.getData(), Toast.LENGTH_LONG).show();
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the video capture
} else {
// Video capture failed, advise user
}
}
}
public void btnIntoSurfaceViedo(View view) {
startActivity(new Intent(this,VideoRecordActivity.class));
}
}
注意: 以上是调用系统自带的录像机
**下面才是本文要介绍的, 也就是一开始的图片效果
一. Activity
public class VideoRecordActivity extends AppCompatActivity{
private Camera camera;
private MediaRecorder recorder;
private boolean isRecording;
private SurfaceHolder holder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_record);
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.video_surface_view);
recorder = new MediaRecorder();
holder = surfaceView.getHolder();
}
@Override
protected void onDestroy() {
super.onDestroy();
recorder.release();
recorder = null;
}
public void btnStartVideoRecord(View view) {
// //把相机拍摄的内容放到SurfaceView来预览
camera = Camera.open();
camera.setDisplayOrientation(90);
// holder.addCallback(this);
if (!isRecording) {
//开始录制
//1. 解锁相机,然后给媒体录制者加上相机
camera.unlock();
recorder.setCamera(camera);
//2. 设置来源
recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
//2.0 设置生成的文件格式
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
//2.1 设置声音编码的格式
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
//2.2 设置录音的声道,2代表立体声
recorder.setAudioChannels(2);
//2.3 设置声音的位速率;
int bitRate = 12 * 1024;//12k
// recorder.setAudioEncodingBitRate(bitRate);
// recorder.setAudioSamplingRate(bitRate);
//2.4 设置视频的码率, 编码格式
int videoRate = 12 * 1024;//12k
// recorder.setVideoEncodingBitRate(videoRate);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
//3. 设置轮廓
// recorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
//4. 设置输出路径
File folder = FileUtil.getMediaRecorderFolder(this);
File targetFile = new File(folder, "audio_video-" + System.currentTimeMillis() + ".mp4");
recorder.setOutputFile(targetFile.getAbsolutePath());
//5. 设置SurfaceView的预览
recorder.setPreviewDisplay(holder.getSurface());
//6. 录制前的配置准备
try {
recorder.prepare();
recorder.start();
} catch (IOException e) {
e.printStackTrace();
}
isRecording = true;
} else {
recorder.stop();
recorder.release();
camera.lock();
isRecording = false;
}
}
public void btnStopVideoRecord(View view) {
//停止录制
if (isRecording) {
isRecording = false;
recorder.stop();
recorder.reset();
Toast.makeText(this,"已完成一个视频的录制....",Toast.LENGTH_SHORT).show();
}
}
}
FileUtil.class中方法
public static File getMediaRecorderFolder(Context context){
File ret = null;
String state = Environment.getExternalStorageState();
File dir=null;
if (state.equals(Environment.MEDIA_MOUNTED)){
//获取公共的照相机储存的文件位置DCIM
dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
if (!dir.exists()){
//获取储存卡中的特定目录
dir=Environment.getExternalStorageDirectory();
dir = new File(dir,"MediaRecorder");
if (!dir.exists()){
dir.mkdirs();
}
}
}else{
//内部储存区
dir = context.getFilesDir();
}
// targetFile = new File(dir, "Image-"+System.currentTimeMillis() + ".jpg");
ret=dir;
return ret;
}