2

我尝试使用 SpeakHere 示例应用程序作为起点来实现 iPhone 声音处理应用程序。该应用程序涉及在播放期间操作缓冲的音频样本。当我将样本乘以一个小数(例如 0.9)时,我会得到噪音。最奇怪的是,当将样本乘以整数(如 1.0、2.0)或从它们中添加或减去时,播放的声音与预期的一样。

我正在使用以下代码片段在 AudioPlayer.m 的播放回调函数中执行此操作:

  //------------------
  //If buffer samples are multiplied by 0.9 we get noise. If we multiply it by 1.0 or add to it everything's fine.
  short *buffer = (short *)calloc(1, numPackets * 2);
  memmove(buffer, bufferReference->mAudioData, numPackets * 2);
  for (int i = 0; i < numPackets; i++)
  {
   buffer[i] *= 0.9;
   //buffer[i] *= 1.0;
   //buffer[i] += 10.0;
  }
  memmove(bufferReference->mAudioData, buffer, numPackets * 2);
  free(buffer);
  buffer = NULL;
  //-------------------

完整的项目可以在这里下载:http: //depositfiles.com/files/lmnkq68n8

谁能指出我做错了什么?我已经为此苦苦挣扎了几天,我完全迷路了。

谢谢!

4

2 回答 2

0

我无法下载您的项目(文件托管商总是告诉我所有插槽都已满),但通过阅读您发布的代码段,您似乎将带符号的 16 位整数(短)值与 0.9(浮点值)相乘)。这导致隐式转换为short。因此,您会丢失小数点后面的所有内容,这反过来会导致信号中出现混叠效应

更新:
我检查了您的代码,但无法弄清楚噪音来自哪里。
为什么要使用 memmove 来操作缓冲区?
您可以通过以下方式直接访问缓冲区:

SInt16* pBuffer = (SInt16*)inCompleteAQBuffer->mAudioData;

我也很想知道是什么导致了这种噪音。因此,如果您发现了这一点,请在此处发布您的解决方案。(也许Core Audio 邮件列表中的某个人可以提供帮助 - 他们在那里真的很有帮助)

如果你只需要改变增益,你可以简单地使用AudioQueueSetParameter
另一种选择是使用 RemoteIO 音频单元而不是 AudioQueueServices。

于 2010-01-17T15:04:53.970 回答
0

这可能只是将缓冲区大端格式转换为系统小端格式以进行乘法并将其再次作为大端存储在缓冲区中的问题。

SInt16* pBuffer = (SInt16*)inCompleteAQBuffer->mAudioData;
for (int i=0; i<44100; i++) {
        sample = CFSwapInt16BigToHost(pBuffer[i]);
        newSample = sample * 0.1;
        pBuffer[i]=CFSwapInt16HostToBig (newSample);
    }

于 2014-09-23T20:02:45.830 回答