一.区别
MediaRecorder和AudioRecord都可以录制音频,区别是MediaRecorder录制的音频文件是经过压缩后的,需要设置编码器。并且录制的音频文件可以用系统自带的Music播放器播放。
而AudioRecord录制的是PCM格式的音频文件,需要用AudioTrack来播放,AudioTrack更接近底层。
PCM可能更加可以理解为音频的源文件
二.优缺点
AudioRecord
主要是实现边录边播以及对音频的实时处理,这个特性让他更适合在语音方面有优势
优点:语音的实时处理,可以用代码实现各种音频的封装
缺点:输出是PCM格式文件,如果保存成音频文件,是不能够被播放器播放的,所以必须先写代码实现数据编码以及压缩
MediaRecorder
已经集成了录音、编码、压缩等,支持少量的录音音频格式,大概有,aac,amr,3gp等
优点:集成,直接调用相关接口即可,代码量小
缺点:无法实时处理音频;输出的音频格式不是很多,例如没有输出mp3格式文件
三.准备工作
我们要实现的是一个实时的去录音,播放,停止等功能的测试案例,那我们肯定要准备点什么,比如说,我这里先创建一个项目——PCMSample
然后写个布局
layout_main.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<LinearLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:orientation=
"vertical"
android:padding=
"10dp"
>
<Button
android:id=
"@+id/startAudio"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"@drawable/button_bg"
android:text=
"开始录音"
android:textColor=
"@android:color/white"
/>
<Button
android:id=
"@+id/stopAudio"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginBottom=
"10dp"
android:layout_marginTop=
"5dp"
android:background=
"@drawable/button_bg"
android:enabled=
"false"
android:text=
"停止录音"
android:textColor=
"@android:color/white"
/>
<Button
android:id=
"@+id/playAudio"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"@drawable/button_bg"
android:enabled=
"false"
android:text=
"播放音频"
android:textColor=
"@android:color/white"
/>
<Button
android:id=
"@+id/deleteAudio"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"5dp"
android:background=
"@drawable/button_bg"
android:text=
"删除PCM"
android:textColor=
"@android:color/white"
/>
<ScrollView
android:id=
"@+id/mScrollView"
android:layout_width=
"match_parent"
android:layout_height=
"0dp"
android:layout_marginTop=
"5dp"
android:layout_weight=
"1"
>
<TextView
android:id=
"@+id/tv_audio_succeess"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"初始化完成...."
android:textColor=
"@color/colorAccent"
/>
</ScrollView>
</LinearLayout>
|
可以预览一下
这里我给按钮加了一个扁平的效果,实际上写了一个xml,很简单
button_bg.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<item android:state_pressed=
"true"
>
<shape>
<corners android:radius=
"30dp"
/>
<solid android:color=
"@color/colorPrimary"
/>
</shape>
</item>
<item android:state_pressed=
"false"
>
<shape>
<corners android:radius=
"30dp"
/>
<solid android:color=
"@color/colorPrimaryDark"
/>
</shape>
</item>
</selector>
|
好的,回到正题,我们这里有四个按钮,分别是开始。停止,播放,和删除,我们就是要实现这四个功能,在此之前,我们还需要做的事情就是添加权限,因为我们要录音和写内存卡文件,所有需要这两个权限即可
1
2
3
4
|
<!--录音-->
<uses-permission android:name=
"android.permission.RECORD_AUDIO"
/>
<!--读取SD卡-->
<uses-permission android:name=
"android.permission.WRITE_EXTERNAL_STORAGE"
/>
|
这里初始化什么的就不说了,我们直接进入正题
四.开始录音
开始录音的话,这里,我们定义一个变量isRecording去控制,这样就比较好结束了,而且要注意的是,录音是不能放在UI线程的,你懂的,所以我们可以写一个开始录音的方法
1
2
3
4
5
6
|