【问题标题】:Android Superpowered SDK Record and Playback simultaneouslyAndroid Superpowered SDK 同时录制和回放
【发布时间】:2016-02-22 23:49:03
【问题描述】:

我的目标是在以低延迟录制设备的麦克风输入的同时播放本地文件。 我来到 Superpowered 库,因为从文档中它提供了低延迟特性。 我已经使用 SuperpoweredAdvancedAudioPlayer 和 SuperpoweredAndroidAudioIO 创建了播放器,它可以正常播放。

SuperpoweredAndroidAudioIO 具有带参数的构造函数 boolean enableInput, boolean enableOutput。目前我正在使用 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 进行录制。

提前致谢!

【问题讨论】:

    标签: android audio android-ndk playback recording


    【解决方案1】:

    经过实验我找到了解决办法。

    1. SuperpoweredRecorder 可以很好地录制曲目;
    2. 我已经创建了分离 SuperpoweredAndroidAudioIO 源 - 一个用于播放,另一个用于录音机。经过一些同步操作后,它运行良好(我将延迟降到了非常低的水平,所以它符合我的需求)。

    我用我实现的想法发布了一些代码sn-p:

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

    希望对某人有所帮助!

    【讨论】:

    • SuperpoweredAndroidAudioIO 负责这一点。拥有多个实例是不必要的代码量。
    • 您能否解释一下在文件中应用效果后如何编写音频输出?
    • @kasurd 你能分享一下正确实现的 GitHub 链接吗?这将非常有帮助..
    • @kasurd 你能对我的要求发表评论吗
    • @DeepakGupta 抱歉,但我没有带有代码的公共仓库。如果您有任何问题,我可以提供帮助。
    【解决方案2】:

    您可以通过将 enableInput 和 enableOutput 设置为 true 的 SuperpoweredAndroidAudioIO 实例来执行此操作。

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

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

    所以它就像,在伪代码中:

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

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

    【讨论】:

    • 感谢 Gabor 的评论。我开始使用这种方法,但后来似乎我需要同时进行两到三场回放和一台录音机。我决定切换到单独的 SuperpoweredAndroidAudioIO。你的方法也适用于我的情况吗?
    • 是的,当然。多个播放器可以处理到同一个缓冲区。 process()方法有bufferAdd参数,只要设置为true,全部使用同一个buffer。
    • 您能否解释一下在文件中应用效果后如何编写音频输出?
    • 嗨,Gabor,您是否介意简短地解释一下您将如何区分来自输入的回调和来自输出的回调以进行 audioProcessing?我的问题是,一旦我将 bufferAdd 设置为 true,播放器的输出就会变得完全乱码。如果我将它设置为false,我可以正常听到文件播放。
    • Superpowered只有一个回调,输入和输出没有分开。回调的缓冲区将包含音频输入,并且必须为输出覆盖。 bufferAdd 表示“将播放器的输出添加到此缓冲区的内容中,不要覆盖”。如果那是乱码,那么缓冲区可能有乱码内容或播放器没有触摸缓冲区(process() 时返回 false)。
    【解决方案3】:

    对我来说,当我将 numberOfSamples 加倍时,这会起作用

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

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

    【讨论】:

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