繁体   English   中英

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

[英]AudioKit, AKPlayer: How to play from Samples, not time

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

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

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

我注意到现在不推荐使用AKSamplePlayer ,但是它确实有一个方法: play(from: Sample, to: Sample)

我的猜测是,我将能够做一些数学到样品位置转换为时间(作为Double在规定AKPlayer ),但我还没有找到合适的数学或函数来做到这一点,任何提示?

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

如何从开始和结束样本中播放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)

我找到了解决方案,本质上是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 ,它的运行效果非常AudioKit

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM