Android多媒体录制

时间:2021-05-30 20:35:31

Android使用MediaRecorder类进行视频的录制。

需要注意,使用MediaRecorder 录音录像 的设置代码步骤一定要按照API指定的顺序来设置,否则报错

步骤为:

1、设置视频源,音频源,即输入源

2、设置输出格式

3、设置音视频的编码格式

 

一、首先看布局文件,这里有一个SurfaceView,这是一个绘制容器,可以直接从内存或者DMA等硬件接口取得图像数据,

<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.xqx.mediarecorder.app.WorkRecorder">

<!-- 开始录制按钮 -->
<Button
android:id
="@+id/startRecord"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content"
android:onClick
="btnStartRecord"
android:text
="开始录制"
/>

<Button
android:id
="@+id/stopRecord"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content"
android:onClick
="btnStopRecord"
android:text
="停止录制"
/>
<SurfaceView
android:id
="@+id/surView"
android:layout_width
="match_parent"
android:layout_height
="match_parent"/>
</LinearLayout>

 

二、Activity 代码

1、首先看下成员变量

    // 开始录制,停止录制按钮
private Button startRecord,stopRecord;
// 显示预览的SurfaceView
private SurfaceView surfaceView;
// 标记,判断当前是否正在录制
boolean isRunning = false;
// 录制类
private MediaRecorder recorder;
// 存储文件
private File saveFile;

2、onCreate()方法中进行一些初始化

     startRecord = (Button) findViewById(R.id.startRecord);
stopRecord
= (Button) findViewById(R.id.stopRecord);
surfaceView
= (SurfaceView) findViewById(R.id.surView);

// onCreate()初始化 ,一开始肯定没有开始录制,所以停止按钮不可点击
stopRecord.setEnabled(false);
     // 设置Surface不需要维护自己的缓冲区
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
// 设置分辨率
surfaceView.getHolder().setFixedSize(320, 280);
// 设置该组件不会让屏幕自动关闭
surfaceView.getHolder().setKeepScreenOn(true);

3、现在看“开始录制”监听事件

----3.1

 创建MediaRecorder对象
   recorder = new MediaRecorder();
recorder.reset();

----3.2 设置三步,顺序固定

//1.设置采集声音
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置采集图像
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
//2.设置视频,音频的输出格式
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
//3.设置音频的编码格式
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
//设置图像的编码格式
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);

----3.3 其他可选设置,更多请查看API

//设置立体声
recorder.setAudioChannels(2);
//设置最大录像时间 单位:毫秒
recorder.setMaxDuration(600000);
//设置最大录制的大小 单位,字节
recorder.setMaxFileSize(1024*1024);
//音频一秒钟包含多少数据位
recorder.setAudioEncodingBitRate(128);
//设置选择角度,顺时针方向,因为默认是逆向90度的,这样图像就是正常显示了,这里设置的是观看保存后的视频的角度
recorder.setOrientationHint(90);
//设置录像的分辨率
recorder.setVideoSize(176, 144);

----3.4 设置文件存储路径,这里简陋了,实际开发中需要判断是否有外部存储,是否有目标目录 ,是否已经存在相同名字的文件 等问题

//设置输出文件路径

saveFile
= new File(Environment.getExternalStorageDirectory()
.getCanonicalFile()
+ "/myvideo.mp4");
recorder.setOutputFile(saveFile.getAbsolutePath());

----3.5 使用SurfaceView进行预览

recorder.setPreviewDisplay(surfaceView.getHolder().getSurface());   

----3.6 开始录制

recorder.prepare();
//开始录制
recorder.start();
//让开始按钮不可点击,停止按钮可点击
startRecord.setEnabled(false);
stopRecord.setEnabled(
true);
isRunning
= true;

----3.7 停止录制

 //停止录制
recorder.stop();
//释放资源
recorder.release();
recorder
= null;
//设置开始按钮可点击,停止按钮不可点击
startRecord.setEnabled(true);
stopRecord.setEnabled(
false);

 

完整代码:

Android多媒体录制Android多媒体录制
  1 package com.xqx.mediarecorder.app;
2
3 import android.app.Activity;
4 import android.media.MediaRecorder;
5 import android.os.Bundle;
6 import android.os.Environment;
7 import android.view.SurfaceHolder;
8 import android.view.SurfaceView;
9 import android.view.View;
10 import android.widget.Button;
11 import android.hardware.Camera;
12
13 import java.io.File;
14 import java.io.IOException;
15
16 public class WorkRecorder extends Activity implements Camera.PreviewCallback {
17
18 // 开始录制,停止录制按钮
19 private Button startRecord,stopRecord;
20 // 显示预览的SurfaceView
21 private SurfaceView surfaceView;
22 // 标记,判断当前是否正在录制
23 boolean isRunning = false;
24 // 录制类
25 private MediaRecorder recorder;
26 // 存储文件
27 private File saveFile;
28 @Override
29 protected void onCreate(Bundle savedInstanceState) {
30 super.onCreate(savedInstanceState);
31 setContentView(R.layout.activity_work_recorder);
32
33 startRecord = (Button) findViewById(R.id.startRecord);
34 stopRecord = (Button) findViewById(R.id.stopRecord);
35 surfaceView = (SurfaceView) findViewById(R.id.surView);
36
37 // onCreate()初始化 ,一开始肯定没有开始录制,所以停止按钮不可点击
38 stopRecord.setEnabled(false);
39
40 // 设置Surface不需要维护自己的缓冲区
41 surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
42 // 设置分辨率
43 surfaceView.getHolder().setFixedSize(320, 280);
44 // 设置该组件不会让屏幕自动关闭
45 surfaceView.getHolder().setKeepScreenOn(true);
46
47 }
48
49 /**
50 * 开始录制
51 * @param view
52 */
53 public void btnStartRecord(View view) {
54
55 // 首先判断当前是否处理视频录制状态,只有不是录制状态的时候,才可以开始录制
56 if (!isRunning){
57 try {
58 //创建MediaRecorder对象
59 recorder = new MediaRecorder();
60 recorder.reset();
61
62
63 //1.设置采集声音
64 recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
65 //设置采集图像
66 recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
67 //2.设置视频,音频的输出格式
68 recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
69 //3.设置音频的编码格式
70 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
71 //设置图像的编码格式
72 recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
73
74 //设置立体声
75 recorder.setAudioChannels(2);
76 //设置最大录像时间 单位:毫秒
77 recorder.setMaxDuration(600000);
78 //设置最大录制的大小 单位,字节
79 recorder.setMaxFileSize(1024*1024);
80 //音频一秒钟包含多少数据位
81 recorder.setAudioEncodingBitRate(128);
82 //设置选择角度,顺时针方向,因为默认是逆向90度的,这样图像就是正常显示了,这里设置的是观看保存后的视频的角度
83 recorder.setOrientationHint(90);
84
85 //设置输出文件路径
86 // saveFile = FileUtils.getMediaRecoderFolder(this);
87 saveFile = new File(Environment.getExternalStorageDirectory()
88 .getCanonicalFile() + "/myvideo.mp4");
89 // recorder.setVideoSize(320, 240);
90 // recorder.setVideoFrameRate(20);
91 recorder.setOutputFile(saveFile.getAbsolutePath());
92 //使用SurfaceView预览
93 recorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
94 recorder.prepare();
95 //开始录制
96 recorder.start();
97 //让开始按钮不可点击,停止按钮可点击
98 startRecord.setEnabled(false);
99 stopRecord.setEnabled(true);
100 isRunning = true;
101 } catch (IOException e) {
102 e.printStackTrace();
103 }
104
105
106 }
107 }
108
109 /**
110 * 结束录制
111 * @param view
112 */
113 public void btnStopRecord(View view) {
114 if (isRunning){
115 //停止录制
116 recorder.stop();
117 //释放资源
118 recorder.release();
119 recorder = null;
120 //设置开始按钮可点击,停止按钮不可点击
121 startRecord.setEnabled(true);
122 stopRecord.setEnabled(false);
123 }
124 }
125
126 @Override
127 public void onPreviewFrame(byte[] data, Camera camera) {
128
129 }
130 }
WorkRecorder

 

本例子只是一个简单的Demo,用于给刚接触MediaRecorder音频录制的coder学习,存在一些Bug和不足,各位coder可以继续拓展

不足:

1、只有当点击“开始录制”的时候SurfaceView组件才可以看到摄像头拍摄的预览,否则是一篇黑,这里可以看下Canera类,进行相应的调整

2、保存路径,需要判断是否有外部存储,存储空间是否足够,路径是否不存在,是否有已有的文件名相同的文件存在等问题,设置文件的名字,我这里是固定路径固定文件名

3、摄像预览效果是有90度旋转的,这里需要大家个人去看下MedioRecoder的API 去进行设置

4、没有设置对焦,像素不清楚,摄像宽高变形