【发布时间】:2018-04-10 04:48:26
【问题描述】:
我在使用 Superpower 时间拉伸功能进行实时音高转换时遇到问题。
我已将this solution 用于我的目的。问题是我正在对输入缓冲区应用更改,该缓冲区是一个短数组,并在处理缓冲区后返回噪声。
这是相关代码--
static bool audioProcessing(void * __unused clientdata, short int *audioInputOutput, int numberOfSamples, int __unused samplerate) {
SuperpoweredAudiopointerList *outputBuffers = new SuperpoweredAudiopointerList(8, 16);
// Create an input buffer for the time stretcher.
SuperpoweredAudiobufferlistElement inputBuffer;
inputBuffer.samplePosition = 0;
inputBuffer.startSample = 0;
inputBuffer.samplesUsed = 0;
inputBuffer.endSample = numberOfSamples; // <-- Important!
inputBuffer.buffers[0] = SuperpoweredAudiobufferPool::getBuffer(
(unsigned int) (numberOfSamples * 8 + 64));
inputBuffer.buffers[1] = inputBuffer.buffers[2] = inputBuffer.buffers[3] = NULL;
// Convert the decoded PCM samples from 16-bit integer to 32-bit floating point.
SuperpoweredShortIntToFloat(audioInputOutput, (float *)inputBuffer.buffers[0],
(unsigned int) numberOfSamples);
// Time stretching.
timeStretch->process(&inputBuffer, outputBuffers);
// Do we have some output?
if (outputBuffers->makeSlice(0, outputBuffers->sampleLength)) {
while (true) { // Iterate on every output slice.
// Get pointer to the output samples.
int _numSamples = 0;
float *timeStretchedAudio = (float *)outputBuffers->nextSliceItem(&_numSamples);
if (!timeStretchedAudio) break;
SuperpoweredFloatToShortInt(timeStretchedAudio, audioInputOutput,
(unsigned int) numberOfSamples);
};
// Clear the output buffer list.
outputBuffers->clear();
}
return true;
}
这是 SuperpoweredAndroidAudioIO 的音频处理功能。我已经在初始化函数中定义了timeStretch。我被困在这一点上,需要一些帮助......
谢谢。
【问题讨论】:
-
我认为这个参考涉及到与
Audio_Processing相关的每一个答案,无论是预处理还是后处理:Android_Audio_Processing_Using_WebRTC,你也可以访问这个参考:stackoverflow.com/a/58546599/10413749
标签: android real-time audio-processing superpowered pitch-shifting