我目前使用 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 成为这个世界上令人难以置信的 Shepard! 最佳答案
要将帧转换为秒,您应该除以音频文件的采样率,而不是硬编码的 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)
关于ios - AudioKit、AKPlayer : How to play from Samples, 没时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52249967/