I am trying to record the voice using AudioRecord class and writing the read bytes to speaker using AudioTrack class. I am able to hear the voice coming from Speaker but the voice is very low and a lot of noise is coming along with the recorded voice.
Any solution to resolve this problem to reduce the noise and loud the actual voice.
I am using below code for this:
package com.my.mic.record;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaRecorder;
import android.util.Log;
public class Record extends Thread
{
int numCrossing,p,numSamples,af;
static final int bufferSize = 200000;
short[] buffer = new short[bufferSize];
short[] readBuffer = new short[bufferSize];
boolean isRecording;
AudioManager am;
public AudioRecord arec;
public AudioTrack atrack;
private int sampleRate = 8000;
public void run() {
isRecording = true;
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
int buffersize =
AudioRecord.getMinBufferSize(sampleRate,AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
arec = new
AudioRecord(MediaRecorder.AudioSource.MIC,sampleRate,AudioFormat.CHANNEL_CONFIGURATION_MONO,AudioFormat.ENCODING_PCM_16BIT,
buffersize);
//buffersize = arec.getMinBufferSize(arec.getSampleRate(),
arec.getChannelConfiguration(), arec.getAudioFormat());
atrack = new
AudioTrack(AudioManager.STREAM_MUSIC,arec.getSampleRate(),arec.getChannelConfiguration(),arec.getAudioFormat(),
buffersize,AudioTrack.MODE_STREAM);
am.setRouting(AudioManager.MODE_NORMAL,AudioManager.ROUTE_EARPIECE,
AudioManager.ROUTE_ALL);
//am.setMode(AudioManager.MODE_NORMAL);
Log.d("SPEAKERPHONE", "Is speakerphone on? : " +
am.isSpeakerphoneOn());
atrack.setPlaybackRate(sampleRate);
byte[] buffer = new byte[buffersize];
arec.startRecording();
atrack.play();
//atrack.setStereoVolume(atrack.getMaxVolume(),
atrack.getMaxVolume());
final float frequency = sampleRate;
float increment 开发者_如何学Python= (float)((2*Math.PI) * frequency / 44100); //
angular increment for each sample
float angle = 0;
//AndroidAudioDevice device = new AndroidAudioDevice( );
while(isRecording) {
try {
arec.read(buffer, 0, buffersize);
atrack.write(buffer, 0, buffer.length);
} catch (Exception e) {
Log.d("Record", ""+e);
}
}
arec.stop();
atrack.stop();
//device.releaseTrack();
isRecording = false;
}
public boolean isRecording() {
return isRecording;
}
public void setRecording(boolean isRecording) {
this.isRecording = isRecording;
}
public AudioManager getAm() {
return am;
}
public void setAm(AudioManager am) {
this.am = am;
}
public void stopRecording(){
arec.stop();
arec.release();
atrack.stop();
atrack.release();
arec=null;
atrack=null;
setRecording(false);
this.stop();
}
}
Go to this working audio record example, if your testing in emulator then sample rate ll be 8000 default. For device increase the sample rate to 44100 or high and record it, it ll work better.
精彩评论