我需要在我的应用程序中实现一项功能,其中工作或需要通过麦克风读取语音的强度。但是我不知道怎么做,有人可以帮帮我吗?我需要阅读声音的强度,不要识别任何单词。
我知道我必须使用AudioRecord类,但我并不是我必须写入代码的步骤,因为我不知道是否真的有必要将一点声音保存到SD卡在读取此信号的最大值后将其转换为PCM。
答案 0 :(得分:2)
AudioRecord类可以让你录制到缓冲区。然后,您可以根据需要选择处理缓冲区或将其保存到SD卡。您想要做的完全取决于您的应用程序。处理后需要数据吗?或者您需要的处理结果是什么?你打算播放录音吗?
如何使用AudioRecord类的简化示例如下:
AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
sampleRate, AudioFormat.CHANNEL_IN_STEREO,
AudioFormat.ENCODING_PCM_16BIT, bufferSize);
recorder.startRecording();
short buf[] = new short[buffersize];
int n = 0;
while(<some condition>) {
n = recorder.read(buf, 0, bufferSize);
process(buf);
}
recorder.stop();
recorder.release();
您显然希望将上述代码放在主UI线程之外的线程中。
您需要确保无论您在进程中执行的操作是否足够快,您都可以在缓冲区填满之前重新读取数据,否则您将丢弃数据。采样率和缓冲区大小取决于您处理数据的方式以及延迟要求。
在您完成所有工作后,您可能会决定将手机放入“扬声器电话”,以便通过麦克风获得更好的收益:
AudioManager amAudioManager;
amAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
amAudioManager.setMode(AudioManager.MODE_IN_CALL);
amAudioManager.setSpeakerphoneOn(true);
是的,您必须将手机放入IN_CALL才能启用扬声器电话。是的,有些手机在IN_CALL时显然会禁用录制功能。