首页 > 解决方案 > 如何在音频过程中使用超强时间拉伸课程

问题描述

我在使用超强时间拉伸来改变我的音频速率时遇到问题。我知道由于输出帧数,我需要处理时间拉伸率乘以帧数。

例如:如果我将时间拉伸率设置为 1.5(增加原始速度的 50%)并且帧数为 144,那么我需要的帧数为 1.5 144=216。当我将时间拉伸率设置为 1.3(增加原始速度的 30%)时,就会出现问题:1.5 144=187.2 - 一个小数。

我的音频处理方法如下:

bool MultiTracksPlayer::process(
  short int *output,
  unsigned int numberOfFrames,
  unsigned int samplerate
) {
  int i = 0;
  for (i = 0; i < tracksAmount; i++) {
    tracks[i]->outputSamplerate = samplerate;
    tracks[i]->syncMode = Superpowered::SyncMode_TempoAndBeat;
  }

  auto numberOfInputFramesNeeded = (int) (timeStretching->rate * (float) numberOfFrames);

  float buffer[3][numberOfInputFramesNeeded * 8 + 64];
  bool silence[3];

  silence[0] = silence[1] = silence[2] = true;

  for (i = tracksAmount - 1; i >= 0; i--) {
    if (tracks[i]->leftVolume > 0) {
      if (tracks[i]->rightVolume > 0) {
        if (tracks[i]->processStereo(buffer[2], !silence[2], numberOfInputFramesNeeded))
          silence[2] = false;
      } else if (tracks[i]->processStereo(buffer[0], !silence[0], numberOfInputFramesNeeded))
        silence[0] = false;
    } else if (tracks[i]->processStereo(buffer[1], !silence[1], numberOfInputFramesNeeded, true))
      silence[1] = false;
  }

  audioMixer.process(
    silence[0] ? nullptr : buffer[0],
    silence[1] ? nullptr : buffer[1],
    silence[2] ? nullptr : buffer[2],
    nullptr,
    buffer[0],
    numberOfInputFramesNeeded
  );

  silence[0] &= silence[1] && silence[2];

  timeStretching->addInput(buffer[0], (int) numberOfInputFramesNeeded);
  timeStretching->getOutput(buffer[0], (int) numberOfFrames);

  if (!silence[0])
    Superpowered::FloatToShortInt(buffer[0], output, numberOfFrames);
  return !silence[0];
}

标签: androidc++audioratesuperpowered

解决方案


我将时间拉伸的方法更改为高级音频播放器播放速率属性。


推荐阅读