AudioKit,AKPlayer:如何从样本播放而不是时间

时间:2018-09-10 01:27:48

标签: ios swift audiokit

我目前非常成功地使用FDWaveFormView来显示代表我从AKMicrophoneAKAudioFile录制的音频的波形。

我能够成功突出显示波形中的特定区域,并且FDwaveForm从音频文件中返回一定范围的采样。

我现在的问题是,我无法在AKPlayer中找到合适的方法来让我从开始采样播放到结束采样。

我注意到AKSamplePlayer现在已被弃用,但是它确实有一种方法:play(from: Sample, to: Sample)

我的猜测是,我将能够做一些数学运算以将样本位置转换为时间(如Double中所规定的AKPlayer),但是我没有找到合适的数学或函数来有任何提示吗?

要明确说明我要执行的操作,请参考下图:

How to get AKPlayer to play from start and end samples

对于可能会看到此问题的任何AudioKit核心成员,请

note ,我知道可以通过多种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成为这个世界不可思议的Shepard!

2 个答案:

答案 0 :(得分:2)

要将帧转换为秒,应除以音频文件的采样率,而不是硬编码的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)

答案 1 :(得分:1)

我找到了解决方案,本质上是DSP 101和样品上的RTFM:

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)

这非常好,再次感谢FDWaveFormViewAudioKit