android - 如何在 android 中使用 super SDK 将文件写入外部存储?

标签 android audio android-ndk audio-recording superpowered

在使用超强的 Android 音频效果(如 flunge、回声、混响等)实现项目时,我能够通过 native 进行录音并在外部存储中写入文件,然后使用超强的交叉渐变器示例,我打开该文件并对其应用效果工作正常。

现在我需要在外部存储中写入带有应用效果的输出文件,但不知道该怎么做。 有这样的 iOS 示例 SuperpoweredOfflineProcessingExample , 但我没有找到它的Android文件解决方案。非常感谢任何帮助制作带有效果的音频输出 wav 文件。

最佳答案

我需要对刚刚录制的音频应用效果(所以我有原始 wav 并对其应用效果)。 这是对原始文件应用效果并将其保存到单独文件的方法的截图:

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;

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

关于android - 如何在 android 中使用 super SDK 将文件写入外部存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42316295/

相关文章:

android - 如何将已经编译好的C库添加到Android中?

java - 从Unity脚本调用Android NDK函数

android - 将文件扩展名与 Xamarin Android 应用程序相关联

android - iPhone麦克风的硬件限制

android - 如何在android共享库中链接多个静态库

javascript - 使用javascript播放声音并打开多个窗口

javascript - 悬停图像时需要播放两种不同的声音吗?

c# - Xamarin.Android wav 到 m4a

android web 应用程序开发框架(css 主题)

java - Fragment 和 ViewPager ClassCastException