我正在尝试使用AudioRecord类和写入来录制语音 使用AudioTrack类读取扬声器的字节数。我能听到 来自扬声器的声音但声音非常低而且很多 噪音随着录制的声音而出现。
任何可以解决此问题的解决方案,以减少噪音和响亮 实际的声音。
我正在使用以下代码:
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 = (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();
}
}