Android 录音和音轨延迟
我正在尝试为android开发一个类似iRig的应用程序,所以第一步是捕获麦克风输入并同时播放 我有它,但问题是我有一些延迟,这使得它不可用,如果我开始处理缓冲区,我担心它会变得完全不可用 我使用的录音带和音轨如下:Android 录音和音轨延迟,android,audio,record,audiorecord,android-audiorecord,Android,Audio,Record,Audiorecord,Android Audiorecord,我正在尝试为android开发一个类似iRig的应用程序,所以第一步是捕获麦克风输入并同时播放 我有它,但问题是我有一些延迟,这使得它不可用,如果我开始处理缓冲区,我担心它会变得完全不可用 我使用的录音带和音轨如下: new Thread(new Runnable() { public void run() { while(mRunning){ mRecorder.read(mBuffer, 0, mBufferSi
new Thread(new Runnable() {
public void run() {
while(mRunning){
mRecorder.read(mBuffer, 0, mBufferSize);
//Todo: Apply filters here into the buffer and then play it modified
mPlayer.write(mBuffer, 0, mBufferSize);
//Log.v("MY AMP","ARA");
}
这种非专业化的方式:
// ==================== INITIALIZE ========================= //
public void initialize(){
mBufferSize = AudioRecord.getMinBufferSize(mHz,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
mBufferSize2 = AudioTrack.getMinBufferSize(mHz,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
mBuffer = new byte[mBufferSize];
Log.v("MY AMP","Buffer size:" + mBufferSize);
mRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
mHz,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
mBufferSize);
mPlayer = new AudioTrack(AudioManager.STREAM_MUSIC,
mHz,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
mBufferSize2,
AudioTrack.MODE_STREAM);
}
您知道如何获得更快的响应吗?
谢谢 我的第一个建议是建议将AudioTrack初始化为静态模式,而不是流媒体模式,因为静态模式的延迟明显较小。但是,静态模式更适合于完全存储在内存中的短声音,而不是从其他地方捕获的声音。但就像一个猜测,如果你将AudioTrack设置为静态模式,并将输入音频的离散块提供给它会怎么样
如果你想更严格地控制音频,我建议你看看Android版的OpenSL ES。学习曲线将更加陡峭,但您可以获得更细粒度的控制和更低的延迟。Android的AudioTrack\AudioRecord类由于最小的缓冲区大小而具有较高的延迟。 根据谷歌的说法,这些缓冲区大小的原因是为了在GC发生时最小化下降(在我看来,这是一个错误的决定,您可以优化自己的内存管理) 您要做的是使用OpenSL,它可以从2.3版获得。它包含用于流式音频的本机API。 以下是一些文档:
只是一个想法,但您不应该阅读
int read = mRecorder.read(mBuffer, 0, 256); /* Or any other magic number */
if (read>0) {
mPlayer.write(mBuffer, 0, read);
}
这将大大减少您的延迟。如果mHz为44100,并且您的单声道配置为256,则延迟将不小于1000*256/44100毫秒=~5.8毫秒。
256/44100是从采样到秒的转换,因此乘以1000可以得到毫秒。
问题在于播放器的内部实现。您无法从java控制这一点。希望这对某人有所帮助:)顺便说一下,一半的Android市场运行的是2.2或更高版本。不想混淆视听——也只是对谷歌安卓平台提供的新“解决方案”反复只对现有市场的一半有用感到沮丧,通常除了手机制造商的贪婪之外,没有其他原因。这个答案是错误的,认为OpenSL具有低延迟。不要在OpenSL上浪费时间,以获得低延迟音频。Android现在和不久的将来都没有这种能力。请参阅以下问题了解详细信息:Paul,你看到你链接的问题的日期了吗?这是过时的。他们在安卓2.3中处理了这个问题。现在情况如何?如何使用录音和音轨获得更快的响应?你是如何解决这个问题的?我也有类似的问题,请看我的问题