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

3

目前我正在使用FDWaveFormView来成功地显示从AKMicrophoneAKAudioFile录制的音频的波形。

我可以成功地突出显示波形中的特定区域,并且FDwaveForm会返回音频文件的一系列样本。

我的问题是我找不到一个合适的方法在AKPlayer中,让我从开始样本播放到结束样本。

我注意到AKSamplePlayer现在已经过时了,但它确实有一个方法:play(from: Sample, to: Sample)

我想我应该能够进行一些数学计算,将样本位置转换为时间(作为Double,如AKPlayer中所述),但我没有找到适当的数学或函数来完成这个任务,有什么提示吗?

为了非常明确地阐述我要做的事情,请参见下面的图像:

How to get AKPlayer to play from start and end samples

注意对于任何可能看到这个问题的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成为这个世界中不可思议的引导者!

2个回答

4
将帧数转换为秒数时,应该使用音频文件的采样率进行除法运算,而不是硬编码的 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)

我完全同意Ryan的观点,我会把你的回答标记为正确答案!只是我比较匆忙....感谢你在AudioKit上所做的所有努力! - Maximilian

1

我找到了解决方案,基本上是阅读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)

这个工作非常出色,再次感谢 FDWaveFormViewAudioKit


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接