如何使用 AVAudioPlayer 更快*和*更高音调地播放音频?

2024-01-09

问题陈述:

我的应用程序中有一组声音效果,存储为.m4a我想要以各种速度和音调播放的文件(AAC 格式,48 KHz,16 位),而无需将所有变体预先生成为单独的文件。

虽然.rate的财产AVAudioPlayer对象可以改变播放速度,它始终保持原始音高,这不是我想要的。相反,我只是想更快或更慢地播放声音样本,并提高或降低音调以匹配 - 就像加速或减慢老式卷轴录音机一样。换句话说,我需要某种方法来从本质上改变音频采样率,例如 +2 半音(快 12%)、–5 半音(慢 33%)、+12 半音(快 2 倍)等。

问题:

有没有什么方法可以从线性 PCM 音频数据中获取AVAudioPlayer对象,使用不同的 iOS 框架应用采样率转换,并将生成的音频数据填充到新的AVAudioPlayer对象,然后可以正常播放吗?

可能的途径:

我正在阅读AudioConverterConvertComplexBuffer。尤其kAudioConverterSampleRateConverterComplexity_Mastering, and kAudioConverterQuality_Max, and AudioConverterFillComplexBuffer()吸引了我的注意。所以这个音频转换框架看起来是可能的。这是我应该进一步探索的途径吗?

要求:

  1. 实际上我不需要立即开始播放。如果采样率转换产生轻微延迟,那也没关系。我的所有样本都是 4 秒或更短,因此我可以想象任何动态重采样都会很快发生,大约为 1/10 秒或更短。 (不过,超过 1/2 就太多了。)

  2. 如果有更简单的方法使用 iOS 提供的转换框架来实现这一点,我真的不想涉足 OpenAL 或 Core Audio 之类的重量级内容。然而,如果有一个simple使用 OpenAL 或 Core Audio 解决这个问题,我很乐意考虑这一点。我所说的“简单”是指可以用 50-100 行代码实现的东西,并且不需要启动额外的线程来将数据提供给声音设备。我宁愿让一切自动处理 - 这就是为什么我愿意在播放之前转换音频剪辑。

  3. 我想在这里避免使用任何第三方库,因为这不是火箭科学,而且我知道它一定可以通过原生 iOS 框架以某种方式实现。

  4. 再次,我需要调整音调和播放速率一起,而不是分开。因此,如果播放速度减慢 2 倍,人声就会变得非常低沉且缓慢。如果播放速度加快 2-3 倍,人声听起来就像是一只快速说话的花栗鼠。换句话说,我绝对不想在保持音频持续时间相同的情况下改变音高,因为当音高向上弯曲超过几个半音时,该操作会导致不受欢迎的“尖细”声音。我只是想加快整个过程的速度,并让音调升高作为自然的副作用,就像老式录音机过去所做的那样。

  5. 需要在 iOS 6 及更高版本中工作,尽管 iOS 5 支持将是一个不错的奖励。


Jack Wu提到的论坛链接有一个建议,其中涉及直接覆盖AIFF头数据。这可能有效,但您将需要 AIFF 文件,因为它依赖于要写入的 AIFF 标头的特定范围。这也需要在创建 AVAudioPlayer 之前完成,这意味着一旦运行就无法修改音高。

如果您愿意采用 AudioUnits 路线,完整的简单解决方案可能约为 200 行(请注意,这假设具有一个函数的代码样式最多需要 7 行,每行一个参数)。有一个 Varispeed AudioUnit,它通过将音高锁定到速率来完全满足您的需求。您基本上需要查看 API、文档和一些示例 AudioUnit 代码来熟悉,然后:

  1. 创建/初始化音频图和流格式(约 100 行)
  2. 创建 RemoteIO AudioUnit 并将其添加到图中(kAudioUnitSubType_RemoteIO)(输出到扬声器)
  3. 创建并添加一个变速单元,并连接变速单元的输出(kAudioUnitSubType_Varispeed) 到 RemoteIO 单元的输入
  4. 创建 AudioFilePlayer 并将其添加到图表中(kAudioUnitSubType_AudioFilePlayer) 单元读取文件并将其连接到变速单元
  5. 启动图表开始播放
  6. 当你想改变音高时,通过AudioUnitSetParameter进行,音高和播放速率的改变将在播放时生效

请注意,还有一个 TimePitch 音频单元,它也允许独立控制音调和速率。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 AVAudioPlayer 更快*和*更高音调地播放音频? 的相关文章

随机推荐

  • 获取“从客户端检测到潜在危险的 Request.Path 值 (&)”

    我有一个 REST 服务 当我尝试调用一个具有 REST 服务的项目时 在它的名字中 我得到了上面的错误 如果我没有编码 这将是有意义的 所以这是我的电话 http localhost 57851 myService Servers myS
  • 根据下一行是否是组行绘制自定义 NSTableRowView

    我有一个习惯NSTableRowView实现显示我的数据单元格 该表还包含使用简单的组行NSTextField 在我的自定义行视图中 我需要稍微更改底部分隔符的绘图 具体取决于下面的下一行是数据单元格 即我的自定义行 还是组标题 对于组标题
  • 动态更改 setInterval 值

    我想动态更改 setInterval 的间隔值 由于 setInterval 回调函数中存在循环 我正在苦苦挣扎 我在stackoverflow上看到了太多问题 但没有任何解决方案可以帮助我 如果有人知道答案 请举例说明 谢谢 这是我的代码
  • 如何使用我的私人 dart 包而不显示在 pub dart lang 上?

    由于我的公司协议 我不想将 dart 包发布到 pub 如何仅将我的 dart 包用于我的公司而不显示在 pub dart lang 上 我查过这个链接https github com dart lang pub issues 1050 h
  • 将 css 变量与 scss 变暗和变亮过滤器一起使用

    我想使用scsslighten and darken CSS4 的函数var 像这样 box shadow inset 0px 2px 50px 45px darken var colorbtn 20 看起来不行 gulp这样写 Error
  • 在我的情况下如何膨胀活动?

    我想实现这样的布局 我的主要活动布局 main xml 请鼠标右键点击以下图片查看图片 我又做了一个内容活动 内容设置为内容 one xml 应该用作上述布局的一部分 右侧部分 我知道我可以通过以下方式膨胀布局 LinearLayout m
  • 在会话中访问数组变量(CodeIgniter)

    我有一个名为 config 的数组 我正在尝试从会话中的数组中回显变量 我试过了 echo this gt session gt userdata config item 但它不起作用 我这里的语法有什么问题吗 我已经打印了我的会话 并且这
  • 词干提取会损害文本分类的精度吗?

    我读到词干提取会损害准确性 但会提高文本分类的召回率 这是怎么发生的 当您进行词干提取时 您会增加查询和示例文档之间的匹配数量 对吗 总是一样的 如果你提高回忆 你就进行了概括 因此 你会失去精确度 将单词词干合并在一起 一方面 应该合并在
  • WCF Silverlight 服务返回自定义错误,但 HTTP 500 响应不是 200

    看来我一直在为 Silverlight WCF 服务中的自定义错误而烦恼 所以我会很高兴尽力买啤酒任何人都可以帮我解决这个问题 经过一番痛苦之后 我终于让我的 WCF 服务抛出自定义错误 ParameterValidationFault 并
  • 激活器:未找到命令

    我正在尝试在我的 Linux 系统中安装 activator 所以首先我安装java sudo add apt repository ppa webupd8team java sudo apt get update sudo apt get
  • Android源码框架修改重建但在模拟器中生效

    我修改 framework base services core java com android server am ActivityManagerService java一些 logcat 输出字符串 我尝试使用不同的方法来重建它 ma
  • 如何将 UIImage 序列化为 JSON?

    我在用 imageData UIImagePNGRepresentation imgvw image 并在发帖时 dic setObject imagedata forKey image after NSData data NSJSONSe
  • TensfoFlow:线性回归损失随着连续纪元的增加(而不是减少)

    我正在学习 TensorFlow 并尝试将其应用于简单的线性回归问题 data是形状为 42x2 的 numpy ndarray 我有点困惑为什么在每个连续的纪元之后损失都在增加 损失不是会随着每个连续的纪元而减少吗 这是我的代码 如果您也
  • SQL Server 2012 连接字符串:无法再找到服务器?

    我刚刚安装了 VS2012 pro RC 和 SQL server Express 2012 我去运行我的应用程序 但收到此错误 连接字符串中的数据源值指定 SQL Server 的实例 那个没有安装 要解决此问题 您可以选择安装 SQL
  • 如何在创建文件的过程中显示进度条?

    如何在创建 PDF 文件时单击按钮时显示进度条 并在创建文件完成后隐藏进度条 public class TwoFragment extends android support v4 app Fragment private View v I
  • 从类调用表单时的 StackOverflow

    我得到了StackOverflowException当我从课堂上调用表格时 In my MainForm我打电话给Youtube cs使用这个类 Youtube yt new Youtube 然后在我的Youtube我称之为MainForm
  • 使用逗号格式化为数字 JSF

    如何在 JSF 中格式化值
  • WCF 序列化异常 - NetDataContractSerializer

    我在尝试将数据集合发送到我们的服务时遇到错误 然而 如果我只向集合中添加一个项目 那么它就可以正常工作 一旦我添加超过一项 我就会收到以下错误 NetDataContractSerializer 不支持使用 SmartTrade Share
  • 如何正确关闭 Node.js TCP 服务器?

    我在 Google 或 SO 上找不到明确的答案 我认识一个net Server实例有一个close方法不允许更多客户端进入 但它不会断开已连接的客户端 我怎样才能做到这一点 我知道如何使用 Http 来完成此操作 我想我是在问它与 Tcp
  • 如何使用 AVAudioPlayer 更快*和*更高音调地播放音频?

    问题陈述 我的应用程序中有一组声音效果 存储为 m4a我想要以各种速度和音调播放的文件 AAC 格式 48 KHz 16 位 而无需将所有变体预先生成为单独的文件 虽然 rate的财产AVAudioPlayer对象可以改变播放速度 它始终保