В настоящее время я с большим успехом использую FDWaveFormView для отображения сигналов, представляющих звук, который я записываю с AKMicrophone
или AKAudioFile
.
Я успешно могу выделить определенные области в форме волны, и FDwaveForm
возвращает диапазон семплов из аудиофайла.
Моя проблема сейчас в том, что я не могу найти подходящий метод в AKPlayer
, который позволил бы мне воспроизвести от начального до конечного сэмпла.
Я заметил, что AKSamplePlayer
устарел, но у него есть метод: play(from: Sample, to: Sample)
Я предполагаю, что я смогу выполнить некоторую математику, чтобы перевести позицию образца во время (как Double
, как предписано в AKPlayer
), однако я не нашел подходящей математики или функций для этого, какие-либо подсказки?
Чтобы быть точным в том, что я пытаюсь сделать, обратитесь к изображению ниже:
Примечание для всех основных участников AudioKit, которые могут увидеть этот вопрос, я знаю, что существует множество компонентов AudioKitUI, которые могут упростить это, однако только FDWaveFormView
предоставил мне функциональность, которая мне нужна для этого конкретного приложения, я рад обсудить дальнейшее офлайн, еще раз большое спасибо.
РЕДАКТИРОВАТЬ
Я придумал код, который, как мне кажется, решил эту проблему:
let startingSampleIndex = self.waveformPlot.highlightedSamples!.min()
let endingSampleIndex = self.waveformPlot.highlightedSamples!.max()
let millisecondsPerSample : Double = 1000 / 44100
let startingDuration : Double = (startingSampleIndex! * millisecondsPerSample) / 1000
let endingDuration : Double = (endingSampleIndex! * millisecondsPerSample) / 1000
print("StartSample:\(startingSampleIndex!) | EndSample:\(endingSampleIndex!) | milliPerSample:\(millisecondsPerSample) | StartDuration:\(startingDuration) | EndDuration:\(endingDuration)")
player.play(from: startingDuration, to: endingDuration)
Основное уравнение - это numberOfSamples * millisecondsPerSample = timeInMilliseconds
, разделив на 1000, я могу нормализовать все до секунд, чего хочет AKPlayer
. Если кто-то увидит здесь что-то проблемное, я бы хотел получить совет, но я думаю, что это помогло! Извините, я все еще новичок в DSP и очень благодарен за то, что AudioKit стал невероятным Шепардом в этом мире!
Я нашел решение, по сути RTFM на DSP 101 и образцы ?:
let startingSampleIndex = self.waveformPlot.highlightedSamples!.min()
let endingSampleIndex = self.waveformPlot.highlightedSamples!.max()
let millisecondsPerSample : Double = 1000 / 44100
let startingDuration : Double = (startingSampleIndex! * millisecondsPerSample) / 1000
let endingDuration : Double = (endingSampleIndex! * millisecondsPerSample) / 1000
print("StartSample:\(startingSampleIndex!) | EndSample:\(endingSampleIndex!) | milliPerSample:\(millisecondsPerSample) | StartDuration:\(startingDuration) | EndDuration:\(endingDuration)")
player.play(from: startingDuration, to: endingDuration)
Это работает превосходно, еще раз спасибо и FDWaveFormView
, и AudioKit
!
Чтобы преобразовать кадры в секунды, вы должны разделить на частоту дискретизации аудиофайла, а не на жестко заданное значение 44100:
guard let frameRange = self.waveformPlot.highlightedSamples else { return }
let startTime = frameRange.min() / audioFile.fileFormat.sampleRate
let endTime = frameRange.max() / audioFile.fileFormat.sampleRate
player.play(from: startTime, to: endTime)
Полностью согласен, Райан, отмечу твой ответ как правильный! Просто двигался быстро .... Спасибо за всю вашу тяжелую работу над AudioKit!