【问题标题】:How to record, modify and playback simultaneously?如何同时录制、修改和回放?
【发布时间】:2015-09-22 16:55:49
【问题描述】:

我正在开发一个 iOS 应用程序。该应用程序旨在模拟助听器。它应该能够先录制声音,然后修改声音(如过滤或频谱增强),最后播放。整个过程要实时完成,即录制和回放之间的延迟应该在1秒以内。看过aurioTouch的示例代码,发现有一个回调函数,在录音的时候调用。我可以只修改该回调中的声音吗?我担心的是修改过程有点耗时(比如大约 0.3 秒)。我可以在回调中做吗?如果不是,为什么?我该怎么办?

【问题讨论】:

  • @abbood 你能帮帮我吗?

标签: ios objective-c callback audiounit


【解决方案1】:

您的问题“录制和播放之间的延迟应在 1 秒内”可能有错字(对于音频应用来说,一秒的延迟非常高……尤其是对于助听器而言。嘴唇运动和音频会不同步)

根据您设置 RemoteIO 的方式,您可以在 5 毫秒到 10 毫秒的范围内将音频从麦克风传到扬声器/耳机。

您的系统非常简单。它只是一个环回系统,但您想在两者之间插入一些信号处理。 (例如 eq 或其他增强功能,例如背景噪声消除、回声抑制等)。

您需要决定是手动进行信号处理,还是要使用 iOS 中当前可用的信号处理音频单元。如果你想在 ios 中使用现有的音频单元,方法是创建一个包含以下项目的音频图 - 远程 io(连接到输入总线 1 上的麦克风,输出总线 1 上的扬声器) - 音频单元效果

如果你想自己编写所有的 DSP 东西,你只需要一个 remoteIO 单元。
回答你的问题“我可以修改那个回调中的声音吗”

是的 - 您可以在麦克风的回调中编写信号处理代码。 但是,您必须在下一次回调发生之前完成所有处理。如果您的音频处理时间过长,您需要通过使用 AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration,... 建议新的缓冲区持续时间大小来增加回调时间(从而增加更多延迟)。

您提到您的处理需要很长时间“(例如大约 0.3 秒)”
那是 300 毫秒,在音频世界中绝对不被视为“近实时”或“低延迟”。但是,您给出的测量结果是开放式的,因为您没有说明处理了多少音频?处理 5 秒的音频需要 0.3 秒吗?处理0.1s的音频需要0.3s吗?

【讨论】:

  • 非常感谢您的详细回复!有些点我不太明白,但我现在没有我的mac,我稍后再问你:)
  • 我当前的缓冲时长是0.1s,播放是断断续续的。我怀疑这是因为 DSP 进程有时会超过 0.1s。我尝试通过 PreferredIOBufferDuration 设置缓冲区持续时间,但 0.1s 似乎是最大值。如果我将它设置为大于 0.1s,缓冲持续时间仍然是 0.1s。可以设置大于0.1s吗?还是我必须优化 DSP 算法?
  • 另外一个问题是,播放中似乎有一些点击声音,点击的频率等于回调函数的频率。如果我删除 DSP 部分,只播放记录,点击声音消失。我还尝试用一些简单快捷的算法替换DSP(比如随机改变输出的音量),点击再次出现。你知道我做错了什么吗?
  • 你确定你的回调是0.1s吗?这是相当大的缓冲区大小。您确定没有将 ms 与 s 混合吗?设置后,获取与 Float32 audioBufferSize 一起使用的实际缓冲区大小; UInt32 大小 = sizeof (audioBufferSize); AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration, &size, &audioBufferSize);
  • 是的,是0.1s。 sampleRate 为 44100Hz,缓冲区中的样本数为 4096。
猜你喜欢
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 2011-11-03
  • 2011-07-05
  • 1970-01-01
  • 2011-05-12
相关资源
最近更新 更多