Android Superpowered SDK同时录制和播放

时间:2015-11-20 13:10:29

标签: android audio android-ndk playback recording

我的目标是在录制设备的麦克风输入时以低延迟播放本地文件。 我来到Superpowered库,因为从文档中它提供了低延迟功能。 我使用SuperpoweredAdvancedAudioPlayer和SuperpoweredAndroidAudioIO创建了播放器,播放效果很好。

SuperpoweredAndroidAudioIO具有参数 boolean enableInput,boolean enableOutput 的construcor。目前我正在使用enableInput == false和enableOutput == true。当我把这些参数设置为true时 - 没有效果。

我想知道是否可以同时录制文件和播放其他文件?

库中也有SuperpoweredRecorder类,但它不是直接写入磁盘。并且需要使用createWAV,fwrite,closeWAV方法。 我已经尝试过单独使用Recorder,但质量不好(它比实际录音快两三倍+声音被分散)。 这是我用过的最简单的录音代码:

void SuperpoweredFileRecorder::start(const char *destinationPath) {
    file = createWAV(destinationPath, sampleRate, 2);
    audioIO = new SuperpoweredAndroidAudioIO(sampleRate, bufferSize, true, false, audioProcessing, NULL, bufferSize); // Start audio input/output.
}

void SuperpoweredFileRecorder::stop() {
    closeWAV(file);
    audioIO->stop();
}

static bool audioProcessing(void *clientdata, short int *audioInputOutput, int numberOfSamples, int samplerate) {
    fwrite(audioInputOutput, sizeof(short int), numberOfSamples, file);
    return false;
}

可能我不能将Superpowered用于此目的,只需要直接使用OpenSL ES进行录制。

提前致谢!

3 个答案:

答案 0 :(得分:5)

经过实验,我找到了解决方案。

  1. SuperpoweredRecorder适用于录制曲目;
  2. 我创建了分离SuperpoweredAndroidAudioIO源 - 一个用于播放,另一个用于录制。经过一些同步操作后,它运行良好(我将延迟降至非常低的水平,因此它符合我的需要)。
  3. 我发布了一些代码片段,其中包含我实施的想法:

    https://bitbucket.org/snippets/kasurd/Mynnp/nativesuperpoweredrecorder-with

    希望它有所帮助!

答案 1 :(得分:4)

您可以使用SuperpoweredAndroidAudioIO的一个实例执行此操作,并将enableInput和enableOutput设置为true。

音频处理回调(在您的情况下为audioProcessing())接收audioInputOutput参数中的音频(麦克风)。只需将其传递给您的SuperpoweredRecorder,它就会将其写入磁盘。

之后,执行SuperpoweredAdvancedAudioPlayer处理,并将结果转换为audioInputOutput。这将转到音频输出。

所以就像在伪代码中一样:

audioProcessing(audioInputOutput) {
   recorder->process(audioInputOutput)
   player->process(some_buffer)
   float_to_short_int(some_buffer, audioInputOutput)
}

永远不要在音频处理回调中做任何fwrite,因为它必须在很短的时间内完成,并且磁盘操作可能太慢。

答案 2 :(得分:0)

对我而言,当我将numberOfSamples加倍时

fwrite(audioInputOutput, sizeof(short int), numberOfSamples * 2, file);

这将导致清晰的立体声输出