Android低仿iOS Messages录音波形效果
一、目标
分析iOS Messages的录音波形效果,为神马笔记添加录音功能做准备。
二、功能分析
1. iOS Messages的波形效果
iOS Messages有2个波形效果
- 录音波形
- 播放波形
2. 录音波形
截图 | 说明 |
---|---|
波形从右向左移动,在左侧逐渐收敛。 | |
左侧的收敛过程非常漂亮。 高度、宽度、位移同时进行收敛,形成一个非常漂亮的动态过程。 |
三、实现效果
实现录音波形效果最大的难度在于实现波形的收敛过程。
尝试了同时收敛高度、宽度和位移的几种方案,效果都不是很理想。
达不到iOS Messages的收敛效果,最后只是简单收敛了高度,宽度和位移保持不变。
四、实现过程
1. 录制音频
音频录制采用MediaRecorder
方式,实现简单并且符合神马笔记的使用场景。
public boolean start() {
boolean result = true;
{
sampler.clear();
waveform.clear();
}
{
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mRecorder.setAudioChannels(1);
mRecorder.setAudioSamplingRate(44100);
mRecorder.setAudioEncodingBitRate(192000);
mRecorder.setOutputFile(targetFile.getAbsolutePath());
}
try {
mRecorder.prepare();
mRecorder.start();
mStartingTimeMillis = System.currentTimeMillis();
mElapsedMillis = 0;
} catch (IOException e) {
e.printStackTrace();
mRecorder.stop();
mRecorder.release();
mRecorder = null;
result = false;
}
{
this.invalidate();
}
return result;
}
2. 波形采样
波形数据通过调用MediaRecorder#getMaxAmplitude()
获取。
public static class Sampler {
int rate; // sample rate per second
int interval; // sample interval in milliseconds
int[] array;
int size;
public Sampler(int rate) {
this.rate = rate;
this.interval = 1000 / rate;