ios - AudioKit,AKPlayer:如何从样本播放,而不是时间
问题描述
我目前正在使用FDWaveFormView来显示代表我从AKMicrophone
或录制的音频的波形非常成功AKAudioFile
。
我成功地突出了波形中的特定区域,并FDwaveForm
从音频文件中返回了一系列样本。
我现在的问题是我找不到合适的方法AKPlayer
来让我从开始样本播放到结束样本。
我注意到AKSamplePlayer
现在已弃用,但它确实有一个方法:play(from: Sample, to: Sample)
我的猜测是我可以做一些数学运算来将 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)
推荐阅读
- excel - 从文本框 dob 计算年龄
- php - 如何使用没有 SMTP 的 phpmailer 修复“无法实例化邮件功能”错误
- python - 创建登录系统
- python - statsmodels 引发 TypeError:输入类型不支持 ufunc 'isfinite'
- javascript - 如何加载不阻止渲染的javascript?绘制完整页后如何加载?
- c++ - 制作一个凯撒密码,它不想破译信息
- c# - 在 C# 的不同类中使用方法的子集作为成员方法
- c# - 游戏对象的变换位置与父级的变换位置不对齐
- swift - 如何在swift4中从文本字段中划分2个双打
- git - 合并请求壁球提交选项是否安全