【问题标题】:Android: Initial audio processing method call takes a long timeAndroid:初始音频处理方法调用需要很长时间
【发布时间】: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


    【解决方案1】:

    解决方案不是一个很好的答案,但这就是我所做的:

    在用户能够在应用程序上执行任何操作之前,我打开了延迟,让它运行大约 2 秒,然后关闭它。这允许回调在不破坏音频的情况下执行其奇怪的 300 毫秒长执行时间。

    显然这不是一个很好的答案,如果有人能找到更合乎逻辑的解释,我会非常乐意将其标记为答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      相关资源
      最近更新 更多