gpt4 book ai didi

android - AudioRecord 和 AudioTrack 回声

转载 作者:行者123 更新时间:2023-11-29 16:22:03 28 4
gpt4 key购买 nike

我正在两台设备之间传输麦克风音频,一切正常,但回声很差。

这是我在做什么

阅读线程

int sampleFreq = 22050; 
int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int minBuffer = 2*AudioTrack.getMinBufferSize(sampleFreq, channelConfig, audioFormat);

AudioTrack atrack = new AudioTrack(AudioManager.STREAM_MUSIC,
sampleFreq,
channelConfig,
audioFormat,
minBuffer,
AudioTrack.MODE_STREAM);
atrack.play();

byte[] buffer = new byte[minBuffer];
while (true) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer);
atrack.write(buffer, 0, buffer.length);
atrack.flush();
} catch (IOException e) {
Log.e(TAG, "disconnected", e);
break;
}
}

这里是录音线程

int sampleRate = 22050; 
int channelMode = AudioFormat.CHANNEL_CONFIGURATION_MONO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int buffersize = 2*AudioTrack.getMinBufferSize(sampleRate, channelMode, audioFormat);

AudioRecord arec = new AudioRecord(MediaRecorder.AudioSource.MIC,
sampleRate, channelMode,
AudioFormat.ENCODING_PCM_16BIT, buffersize);

buffer = new byte[buffersize];
arec.startRecording();

while (true) {
arec.read(buffer, 0, buffersize);
new Thread( new Runnable(){
@Override
public void run() {
try {
mOutputStream.write(buffer);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}

我做错了什么吗?

最佳答案

您需要回音消除逻辑。这是我在我的 Arm5 (WM8650) 处理器 (Android 2.2) 上为消除回声所做的。

  1. 在将 PCM 帧发送到编码器之前,我用 JNI 封装了 Speex 并调用了回显处理例程。无论我尝试了何种 Speex 设置,都没有回音被取消。

  2. 因为 Speex 对播放和回声帧之间的延迟非常敏感,所以我实现了一个队列并将所有发送到 AudioTrack 的数据包排队。队列的大小应大致等于内部 AudioTrack 缓冲区的大小。这样,当 AudioTrack 将数据包从其内部缓冲区发送到声卡时,数据包就会大致发送到 echo_playback。使用这种方法消除了延迟,但仍然没有取消回声

  3. 我用 JNI 包装了 WebRtc 回声消除部分,并在将数据包发送到编码器之前调用了它的方法。回声仍然存在,但图书馆显然试图取消它。

  4. 我应用了 P2 中描述的缓冲技术,它终于开始起作用了。但是,需要针对每个设备调整延迟。另请注意,WebRtc 具有回声消除的移动版和完整版。完整版会大大降低处理器速度,可能只能在 ARM7 上运行。手机版可以,但画质较差

我希望这会对某人有所帮助。

关于android - AudioRecord 和 AudioTrack 回声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6738155/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com