【问题标题】:Getting audio samples from speakers从扬声器获取音频样本
【发布时间】:2019-10-30 18:56:41
【问题描述】:

所以我有两个问题:

  1. 是否有另一种(可能是低级)方法来获取当前正在播放的音频的 float* 样本?
  2. 是否可以从框架内部进行?我的意思是当您无权访问拥有音频文件的 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


【解决方案1】:

iOS 应用只能从应用本身正在播放的原始 PCM 样本中获取播放的音频样本。 iOS 安全沙箱会阻止对其他应用程序或进程输出的样本的任何可见性。 iOS 应用可以从设备的麦克风中采样音频。

在音频引擎 Tap-on-bus 中,音频样本被传送到应用程序的主线程,因此在回调频率和延迟方面受到限制。为了获取最近几毫秒的麦克风音频样本,应用需要使用 RemoteIO Audio Unit 回调 API,其中音频样本可以在高优先级音频上下文线程中传递。

【讨论】:

  • 问题是我根本不需要麦克风样本。我只需要播放一些音频文件并实时获取样本,以便计算高密度 FFT 并显示一些可视化......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
相关资源
最近更新 更多