【Android】录音机

程序源码:http://download.csdn.net/detail/jsgaobiao/9456694

Ø  【实验目的】

使用AndroidStudio实现一个录音机的功能,要求有录音、播放等按钮并显示出声音的时域波形。

选做:显示出声音的频率波形。

 

Ø  【实验器材】

Android Studio 1.5.1

Xiaomi Pad (7.9’’): Android 4.4.4 , 1536*2048 xhdpi

 

Ø  【实验原理】

一、UI界面的设计【Android】录音机_第1张图片

1、 UI界面采用框架布局(FrameLayout),并在最高层的FrameLayout属性中添加android:background="@drawable/background"属性,设置背景图片。其中,背景图片文件放在工程“\app\src\main\res\drawable”目录下。

2、 在背景FrameLayout上添加4个按钮(Button)——开始录音、结束录音、播放录音、结束播放。设置好字号、id、对齐等属性。

【Android】录音机_第2张图片

3、 在按钮下方的空白区域添加一个FrameLayout布局,并在其中添加自定义的DrawView组件用于显示波形。

其中,DrawView是View组件的子类

【Android】录音机_第3张图片

二、录音和播放功能的实现

1、 录音功能依靠MediaRecorder类实现。

首先定义MediaRecorder类的对象myRecorder,并将其与”开始录音”、“停止录音”按钮关联。

在”开始录音“的监听函数中,通过myRecorder设置录音源为麦克风,以及录音文件的格式(MPEG_4)、路径和编码方式(DEFAULT)等。

【Android】录音机_第4张图片

在”停止录音”的监听函数中,执行myRecorder的stop()函数,并将myRecorder释放。

2、 播放功能依靠MediaPlayer类实现。

首先定义MediaPlayer类的对象myPlayer,并将其与“播放录音”、“停止播放”按钮的监听函数关联。

在“播放录音”的监听函数中,设置播放文件的路径为“开始录音”中保存的文件路径,并执行myPlayer.start()函数进行播放。

在”停止录音”的监听函数中,执行myPlayer的release()函数,将myPlayer对象释放掉。

3、 为了保证程序的正确运行,防止出现如“未结束录音就开始播放”等可能使得程序崩溃的情况出现,我为4个按钮的监听程序加上了互斥锁——也就是程序中的Recording和Playing两个boolean变量。

通过判断当前是否在录音中或播放中,保证错误的按键顺序不会被执行。同时,如果按键的顺序出现错误,还会出现如:”上一段录音正在播放,请结束播放后重试!“等提示信息。

【Android】录音机_第5张图片

 

三、波形绘制

1、 时域波形绘制

通过回调onWaveFormDataCapture函数更新获得waveform的数据,并根据数据的大小将其映射成长短不一的波形(如上图所示)。其中采样的数据个数为128个,采样频率为Visualizer.getMaxCaptureRate() / 2;

 【Android】录音机_第6张图片

2、 频域波形绘制

通过回调onFftDataCapture函数获得fft[]的数据,对其进行一些简单的处理。

其中采样数据个数、采样频率都和1中相同,range=48——将频率数据映射为range等份,再通过直方图的形式可视化,以示和时域波形的区别。其效果如下图所示:

【Android】录音机_第7张图片

 

Ø  【小结】

因为之前没有接触过Android编程,第一次实验花费了挺多的时间,收获还比较多。

首先是基本了解了Android工程的结构和Android Studio的基本使用,熟悉了Java的基本语法。其次基本掌握了MediaRecorder、MediaPlayer等音频处理相关的类,学会了使用IDE进行调试和处理错误。

借这个机会我还购买了两本Android编程的书,希望这学期可以跟随机器感知实验这门课程读完这两本书,掌握Android应用开发的本领。


你可能感兴趣的:(android,录音机)