android - 如何在不使用双簧管库的情况下同时实现音频录制和播放的最小延迟?
问题描述
我正在使用 audioRecord 和 audioTrack 录制和播放音频,工作正常但有延迟。经过一番研究,我只发现了有关双簧管库(OpenSl 和 Aaudio)的东西。我想尽量减少延迟,因为可以使用 audioRecord 和 audioTrack 减少,但我不知道这是否可能。这是我的代码的一部分:
protected void recordAndPlay() {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
final int bufferSizeIn = AudioRecord.getMinBufferSize(freq,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT);
final int bufferSizeOut = AudioTrack.getMinBufferSize(freq,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION/*MediaRecorder.AudioSource.MIC*/, freq,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT, bufferSizeIn);
audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, freq,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT, bufferSizeOut,
AudioTrack.MODE_STREAM);
buffer = new short[bufferSizeIn];//buffer de amostras
audioRecord.startRecording(); //começa a captar a voz
Log.i("", "Audio Recording started");
audioTrack.play(); //começa a transmitir a voz
Log.i("", "Audio Playing started");
Rthread = new Thread(new Runnable() {
public void run() {
while (true) {
try {
audioRecord.read(buffer, 0, bufferSizeIn);
audioTrack.write(buffer,0,bufferSizeIn);
} catch (Throwable t) {
Log.e("Error", "Read write failed");
t.printStackTrace();
}
}
}
});
Rthread.start();
}
解决方案
推荐阅读
- c - 从 armcc 迁移到 armclang 会导致节类型冲突
- javascript - Javascript Lodash按外部数组和内部属性排序
- ddl - CREATE TABLE 语句不适用于 CHECK 约束
- javascript - MS Office 加载项、JavaScript 和 async/await
- qt - QGridLayout 中的 MouseEvent
- javascript - 如果文件长度超过 1 GB,如何将文件表单客户端上传到服务器?
- java - 通过示例在 Windows 10 机器上安装 Java 可执行文件
- javascript - 如何显示对象数组的每个元素的长度?
- angular-httpclient - Angular httpClient catchError 不返回错误对象
- javascript - 通过 URL 访问剃须刀页面时,浏览器尝试从无效地址加载 JS 文件