我尝试创建一个音频缓冲区并将他发送到一个新类。 在这个类中,我将使用AudioTracker播放此缓冲区,但它不起作用。 我可以按时听到声音,但声音就像一个halleffect。我没有想到我的错误,也没有找到这个问题的答案。 我希望你能帮助我。 (对不起,我的英语不是最好的) Sorcecode:
public class input {
private static final String TAG = "Aufnahme";
private AudioRecord recorder = null;
private boolean isRecording = false;
private int SAMPLERATE = 8000;
private int CHANNELS = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
private int bufferSize = AudioRecord.getMinBufferSize(SAMPLERATE, CHANNELS,
AUDIO_FORMAT);
private Thread recordingThread = null;
public void startRecording() {
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLERATE,
CHANNELS, AUDIO_FORMAT, bufferSize);
recorder.startRecording();
isRecording = true;
recordingThread = new Thread(new Runnable()
{
public void run() {
writeAudioData();
}
});
recordingThread.start();
}
public void stopRecording() {
isRecording = false;
recorder.stop();
recorder.release();
recorder = null;
recordingThread = null;
}
private void writeAudioData() {
byte data[] = new byte[bufferSize];
while (isRecording) {
recorder.read(data, 0, bufferSize);
send(data);
}
}
private void send(byte[] data) {
int minBufferSize = AudioTrack.getMinBufferSize(8000,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 8000,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, minBufferSize,
AudioTrack.MODE_STREAM);
at.play();
at.write(data, 0, bufferSize);
at.stop();
at.release();
}
答案 0 :(得分:4)
好的,我发现了问题。大厅效果来自实时录制的扬声器声音。错误。
答案 1 :(得分:0)
将数据写入AudioTrack
对象,实际打开它,写入缓冲区,关闭并释放它的原因,如果最小缓冲区大小如此之小,您实际上无法听到因为启动AudioTrack。这就是通过改变缓冲区大小来解决的原因。如果您将其设为8000并且采样率为8000,您将听到延迟一秒钟的声音。要解决这个问题,请删除send方法并将writeAudio方法更改为:
private void writeAudioData(){ byte data [] = new byte [bufferSize];
int minBufferSize = AudioTrack.getMinBufferSize(8000,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 8000,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, minBufferSize,
AudioTrack.MODE_STREAM);
at.play();
while (isRecording) {
recorder.read(data, 0, bufferSize);
at.write(data, 0, bufferSize);
}
at.stop();
at.release();