首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在android下使用superpowered SDK将文件写到外部存储?

如何在android下使用superpowered SDK将文件写到外部存储?
EN

Stack Overflow用户
提问于 2017-02-18 22:18:18
回答 1查看 1.2K关注 0票数 3

当执行一个项目使用超强的Android音频效果,如flunge,回声,混响等,我能够通过本机录制和写入文件在外部存储,然后使用超强的交叉推子示例我打开该文件,并在它上应用效果很好。

现在我需要将输出文件写入外部存储器,并应用特效,但不知道如何做到这一点。有像SuperpoweredOfflineProcessingExample这样的iOS例子,但我没有找到它对安卓文件的解决方案。任何帮助将高度赞赏,使音频输出wav文件的效果。

EN

回答 1

Stack Overflow用户

发布于 2017-02-20 21:23:36

我有一个应用效果的要求,只是录制的音频(所以我有原始的wav和应用效果)。以下是将效果应用于原始文件并将其保存到单独文件方法的截图:

代码语言:javascript
复制
applyEffect(const char *input, const char *output, int effectId) {

SuperpoweredDecoder *decoder = new SuperpoweredDecoder();

const char *openError = decoder->open(input, false);
if (openError) {
    delete decoder;
    return false;
};

FILE *fd = createWAV(output, decoder->samplerate, 2);
if (!fd) {
    delete decoder;
    return false;
};

float effectMix = 0.5f;
SuperpoweredFX *effect = NULL;
if (effectId == 0) {
    effect = new SuperpoweredEcho(decoder->samplerate);
    ((SuperpoweredEcho *) effect)->setMix(effectMix);
} else if (effectId == 1) {
    effect = new SuperpoweredReverb(decoder->samplerate);
    ((SuperpoweredReverb *) effect)->setMix(effectMix);
}

if (effect == NULL) {
    delete decoder;
    return false;
}

effect->enable(true);

// Create a buffer for the 16-bit integer samples coming from the decoder.
short int *intBuffer = (short int *)malloc(decoder->samplesPerFrame * 2 * sizeof(short int) + 16384);
// Create a buffer for the 32-bit floating point samples required by the effect.
float *floatBuffer = (float *)malloc(decoder->samplesPerFrame * 2 * sizeof(float) + 1024);

// Processing.
while (true) {
    // Decode one frame. samplesDecoded will be overwritten with the actual decoded number of samples.
    unsigned int samplesDecoded = decoder->samplesPerFrame;
    if (decoder->decode(intBuffer, &samplesDecoded) == SUPERPOWEREDDECODER_ERROR) {
        break;
    }
    if (samplesDecoded < 1) {
        break;
    }

    // Apply the effect.

    // Convert the decoded PCM samples from 16-bit integer to 32-bit floating point.
    SuperpoweredShortIntToFloat(intBuffer, floatBuffer, samplesDecoded);

    effect->process(floatBuffer, floatBuffer, samplesDecoded);

    // Convert the PCM samples from 32-bit floating point to 16-bit integer.
    SuperpoweredFloatToShortInt(floatBuffer, intBuffer, samplesDecoded);
    }

    // Write the audio to disk.
    fwrite(intBuffer, 1, samplesDecoded * 4, fd);

};

// Cleanup.
closeWAV(fd);
delete decoder;
delete effect;
free(intBuffer);
free(floatBuffer);
return true;

}

将创建具有应用效果的新文件。希望它能以某种方式帮助你!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42316295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档