Также возможно изменять скорость с помощью линейной интерполяции при прохождении аудиоданных.
Звуковые значения располагаются в массиве, и курсор обычно переходит от значения к значению.Но вы можете настроить процесс на произвольную величину, например, 1,5 кадра, и создать взвешенное значение, где это необходимо.
Предположим, данные следующие:
- 0,5
- 0,8
- 0,2
- -0,1
- -0,5
- -0,7
Ваши данные воспроизведения (для 1,5скорость) будет
- 0,5
- (0,8 + 0,2) / 2
- -0,1
- (- 0,5 + -0,7) / 2
Я знаю, что были сообщения, которые более полно объясняют этот алгоритм раньше в переполнении стека.Простите, что не выследил их.
Я использую этот метод, чтобы разрешить в реальном времени изменения скорости воспроизведения .wav в следующей библиотеке с открытым исходным кодом: AudioCue .Не стесняйтесь проверить код и использовать идеи в нем.
Ниже описан метод, который создает стереопару звуковых значений из точки, которая находится между двумя звуковыми кадрами (данные представляют собой числа с плавающей запятой в диапазоне от -1 до 1).Это из внутреннего класса AudioCuePlayer
в AudioCue.java
.Наверное, не самый простой для чтения.Считываемые звуковые данные находятся в массиве cue
, а idx
является текущим местоположением "головки воспроизведения", которое проходит через этот массив.intIndex - это аудио кадр, а flatIndex - фактическое расположение кадра в массиве.Я использую кадры для отслеживания местоположения точки воспроизведения и вычисления весов интерполяции, а затем использую flatIndex для получения соответствующих значений из массива.
private float[] readFractionalFrame(float[] audioVals, float idx)
{
final int intIndex = (int) idx;
final int flatIndex = intIndex * 2;
audioVals[0] = cue[flatIndex + 2] * (idx - intIndex)
+ cue[flatIndex] * ((intIndex + 1) - idx);
audioVals[1] = cue[flatIndex + 3] * (idx - intIndex)
+ cue[flatIndex + 1] * ((intIndex + 1) - idx);
return audioVals;
}
Я был бы рад уточнить, если есть вопросы.