当音高变换时,SoundTouch库会弄乱结尾

时间:2016-06-21 12:00:31

标签: c++ pitch-shifting soundtouch

我正在使用SoundTouch库来移位一些音频文件。一切都运作良好,除了新的音频文件的最后几百毫秒不像原始文件。这是原始文件:enter image description here

这就是我在换档后得到的结果: enter image description here

你可以看到结局不对。这就像原始文件中没有任何内容,当然有。

这是我正在使用的代码:

int generateFile(WavInFile *file, SoundTouch *st, string fileName, int semitones)
{
  const bool speech = true; 

SAMPLETYPE samples[BUFF_SIZE];

WavOutFile *out = new WavOutFile(fileName.c_str(), (int)file->getSampleRate(), (int)file->getNumBits(), (int)file->getNumChannels());

int nChannels = (int)file->getNumChannels();

assert(nChannels > 0);

int num, nSamples;
int buffSizeSamples = BUFF_SIZE / nChannels;

st->setSampleRate((int)file->getSampleRate());
st->setChannels(nChannels);
st->setPitchSemiTones(semitones);

if (!speech)
{
    st->setSetting(SETTING_USE_QUICKSEEK, 0);
    st->setSetting(SETTING_USE_AA_FILTER, 0);
}
else
{
    st->setSetting(SETTING_USE_QUICKSEEK, 0);
    st->setSetting(SETTING_SEQUENCE_MS, 40);
    st->setSetting(SETTING_SEEKWINDOW_MS, 15);
    st->setSetting(SETTING_OVERLAP_MS, 8);
}



while (file->eof() == 0)
{
    num = file->read(samples, BUFF_SIZE);

    nSamples = num / (int)file->getNumChannels();

    st->putSamples(samples, nSamples);

    do 
    {
        nSamples = st->receiveSamples(samples, buffSizeSamples);
        out->write(samples, nSamples * nChannels);
    } while (nSamples != 0);
}


st->flush();

do 
{
    nSamples = st->receiveSamples(samples, buffSizeSamples);
    out->write(samples, nSamples * nChannels);
} while (nSamples != 0);

delete out;

return 0;

}

是的,我稍后在我的代码中删除了WavInFile *文件。所以我的问题是 - 为什么SoundTouch会这样做,我该如何解决?

此外,我不能简单地删除新音频文件的错误部分,因为我以这种方式生成数百个文件,因此切割它们中的每一个都是...

0 个答案:

没有答案