【发布时间】:2016-11-07 20:56:01
【问题描述】:
我的 Android 应用(使用 NDK/OpenSL ES)中的音频回调遇到了一个非常特殊的问题。我以 44.1 kHz 和 512 帧传输音频输出(这给了我 11.6 毫秒的回调时间)。在回调中,我正在合成几个波形、滤波器等(如合成器)。由于优化,我从未达到超过 5 毫秒的回调时间。但是,当我打开特定效果(数字延迟线)时,回调开始需要更长的时间。数字延迟线将从 7.5 毫秒(在处理完所有语音/滤波器之后)跳到 100 到 350 毫秒。
这是最令人困惑的部分;可能在 1 或 2 秒后,数字延迟执行时间将从极高的时间跳到每个回调的 0.2 毫秒完成时间。
为什么 Android 应用需要很长时间才能在前几个回调中完成我的数字延迟处理代码,然后逐渐消亡到非常短且音频愉快的时间?我现在有点不知所措,不知道如何解决这个问题。确认一下,这只发生在延迟处理方法中。它只是一个标准的数字延迟线(你可以在 github 上找到一些),我觉得算法不是这里的问题......
我的音频回调代码的样子的伪代码/粗略草图:
static bool myAudioCallback(void *userData, short int *audIO, int numSamples, int srate) {
AudioData *data = (AudioData *)userData;
// Resets pointer array values to 0
for (int i = 0; i < numSamples; i++) data->buffer[i] = 0;
// Voice Generation Block
for (int voice = 0; voice < data->numVoices; voice++) {
// Reset voice buffers:
for (int i = 0; i < numSamples; i++) data->voiceBuffer[i] = 0;
// Generate Voice
data->voiceManager[voice]->generateVoiceBlock(data->voiceBuffer, numSamples);
// Sum voices
for (int i = 0; i < numSamples; i++) data->buffer[i] += data->voiceBuffer[i]];
}
// When app first starts, delayEnabled = false so user must click on a
// button on the UI to enable it.
// Trouble is that when we enable processDelay(double *buffer, in frames) the
// first time, we get a long execution time.
if (data->delayEnabled) {
data->delay->processDelay(data->buffer, numSamples);
}
// Conversion loop
for (int i = 0; i < numSamples; i++) {
double sample = clipOutput(data->buffer[i]);
audIO[2*i] = audIO[(2*i)+1] = CONV_FLT_TO_16BIT(sample * data->volume);
}
}
谢谢!
【问题讨论】:
标签: android audio android-ndk opensl