Как записать файл на внешнее хранилище, используя сверхспособный SDK в Android?
При реализации проекта с использованием звуковых эффектов суперспособности для Android, таких как flunge, echo, reverb и т. Д., Я могу сделать запись через нативный и записать файл во внешнее хранилище, а затем, используя пример сверхскоростного кроссфейдера, открываю этот файл и применяю к нему эффекты, которые прекрасно работают.
Теперь мне нужно записать выходной файл во внешнее хранилище с примененными эффектами, но я не знаю, как это сделать. Для этого есть примеры iOS, такие как SuperpoweredOfflineProcessingExample, но я не нашел его решения для файла Android. Любая помощь будет высоко оценена, чтобы сделать аудио-WAV-файл с эффектами.
1 ответ
У меня было требование применить эффект к только что записанному аудио (поэтому у меня есть оригинальный 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;
}
Новый файл будет создан с применением эффекта. Надеюсь, это поможет вам как-то!