我目前非常成功地使用FDWaveFormView来显示代表我从AKMicrophone
或AKAudioFile
录制的音频的波形。
我能够成功突出显示波形中的特定区域,并且FDwaveForm
从音频文件中返回一定范围的采样。
我现在的问题是,我无法在AKPlayer
中找到合适的方法来让我从开始采样播放到结束采样。
我注意到AKSamplePlayer
现在已被弃用,但是它确实有一种方法:play(from: Sample, to: Sample)
我的猜测是,我将能够做一些数学运算以将样本位置转换为时间(如Double
中所规定的AKPlayer
),但是我没有找到合适的数学或函数来有任何提示吗?
要明确说明我要执行的操作,请参考下图:
对于可能会看到此问题的任何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!
答案 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)
这非常好,再次感谢FDWaveFormView
和AudioKit
!