如何降低 iphone 的 sdk Audioqueue 的声音?

Posted

技术标签:

【中文标题】如何降低 iphone 的 sdk Audioqueue 的声音?【英文标题】:How to lower sound on the iphone's sdk Audioqueue? 【发布时间】:2009-10-08 20:50:39 【问题描述】:

我正在使用 Aran Mulhollan 的 RemoteIOPlayer,在 SDK iphone 中使用音频队列。 我可以没有问题: - 添加两个信号来混合声音 - 通过乘以我从 wav 文件中获得的 UInt32 来增加音量

但是所有其他操作都会给我带来扭曲和失真的声音,尤其是我无法分割信号。我似乎无法弄清楚我做错了什么,除法的实际结果似乎很好;声音/信号处理的某些方面显然必须躲避我:)

任何帮助表示赞赏!

【问题讨论】:

【参考方案1】:

你尝试过这样的事情吗?

- (void)setQueue:(AudioQueueRef)ref toVolume:(float)newValue 
  OSStatus rc = AudioQueueSetParameter(ref, kAudioQueueParam_Volume, newValue);
  if (rc) 
    NSLog(@"AudioQueueSetParameter returned %d when setting the volume.\n", rc);
  

【讨论】:

如何从AudioQueue创建AudioQueueRef?? AudioQueueRef 是音频队列的不透明句柄,因此您不要“从 AudioQueue 创建 AudioQueueRef”。在developer.apple.com/library/mac/#documentation/MusicAudio/…中寻找AudioQueueNewInput/AudioQueueNewOutput@【参考方案2】:

首先你提到的代码没有使用AudioQueues,它使用了AudioUnits。在 iphone 中混合音频的最佳方法是使用内置的混音器单元,在您从 here 下载原始示例的网站上有一些代码。除此之外,我会在您的代码操作系统中检查您是否拥有正确的数据类型。当您应该使用有符号整数时,您是否正在尝试对无符号整数进行操作?通常会产生扭曲的结果(可以理解)

【讨论】:

【参考方案3】:

iPhone 将音频处理为 16 位整数。大多数音频文件已经标准化,因此峰值样本值是适合 16 位有符号整数的最大值。这意味着如果将两个这样的样本加在一起,就会溢出,或者在这种情况下,会出现音频剪辑。如果要将两个音频源混合在一起并确保没有削波,则必须对样本进行平均:将它们加在一起并除以 2。或者您将音量设置为一半。如果您使用分贝,那将是大约 -6 dB 的变化。

【讨论】:

将交易量减半是一个令人讨厌的权衡,IMO。混合两个通道时,您可以摆脱它 - 但随着您混合的次数越来越多,您的通道会变得越来越安静。最好(IMO)将您的样本混合到 sint32_t 中并将值限制在 sint16_t 范围内。产生的削波不会像您想象的那样频繁发生,因为大多数样本都不是极端的,并且您最终会得到所有通道的全音量。 除了混合 32 位整数中的样本外,您还可以实现一个动态压缩器,其行为类似于具有即时启动和相当短(10 毫秒)释放的限制器。它可以实现为 IIR(无限输入响应)滤波器,其中一个变量表示音量减小以防止削波,然后随着每个连续采样缓慢升高到原始音量。

以上是关于如何降低 iphone 的 sdk Audioqueue 的声音?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 iOS 6 sdk 为 iPhone 4s 或 iPhone 4 制作视图控制器?

如何使用 abbyy mobile sdk for iphone 获取坐标

如何降低或提高 Spotify SDK Swift 中的音乐音量

Iphone 4 sdk - 如何确定 applicationWillEnterForeground 是不是因通知而被触发?

如何使用最新的 SDK 为原始“iPhone”开发?

如何提交在 iPhone OS 3 和 iPhone SDK 4 上运行的应用程序版本?