【发布时间】:2019-10-30 18:56:41
【问题描述】:
所以我有两个问题:
- 是否有另一种(可能是低级)方法来获取当前正在播放的音频的 float* 样本?
- 是否可以从框架内部进行?我的意思是当您无权访问拥有音频文件的 AVPlayer(或 AVAudioPlayerNode、AudioEngine,甚至低级 CoreAudio 类等)的实例时?有没有办法订阅(为了分析,或者也可能是为了修改/均衡)通过扬声器/耳机播放的音频样本?
我尝试在audioEngine.mainMixerNode 上安装一个水龙头,它可以工作,但是当我将 bufferSize 设置为大于 4096(为了计算高密度 FFT)时,回调的调用频率低于它应该调用的频率(大约 3一秒钟而不是 30 次甚至频繁)。
mixerNode.installTap(onBus: 0,
bufferSize: 16384, //or 8192
format: mixerNode.outputFormat(forBus: 0))
{[weak self] (buffer, time) in
//this block is being called LESS frequently...
}
我知道CoreAudio非常强大,应该有一些东西用于这种目的..
【问题讨论】:
-
“是否有另一种(可能是低级)方法来获取当前正在播放的音频的 float* 样本?”不可以。您不能访问其他进程的音频输出。您只能访问您直接控制的音频流。
-
@RobNapier 那么如何更频繁地获取高密度样本?
-
@RobNapier 有什么方法可以比 tap 提供的更频繁地获取具有更高 bufferSize 的样本? F.e.使用 CoreAudio API?
-
点击读取输入;它不会对输出进行采样。我的意思是它应该基于来源。我不希望它结合所有内容,然后以某种高频率重新采样。输入一些已知信号,看看您是否真的遇到了 FFT 问题。如果您以 3Hz 的频率获得 16k 个样本,则超过 44.1kHz。我不希望 iPhone 上的任何音频采样速度超过 44.1kHz。
标签: ios swift fft core-audio