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

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

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

任何帮助表示赞赏!

【问题讨论】:

    标签: iphone objective-c audio sdk audioqueueservices


    【解决方案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);
      }
    }
    

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

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