如何从音频队列缓冲区中提取整数样本并将修改后的样本写回?

时间:2011-01-28 15:40:24

标签: iphone objective-c buffer sample audioqueue

对于iphone语音更改应用程序(目标c),我试图从录制音频队列缓冲区中取样采样的整数值,在函数中处理它们并将修改后的值写回回放缓冲区。 目前我使用这样的东西

AudioBuffer audioBuffer = bufferList->mBuffers[0];
int bufferSize = audioBuffer.mDataByteSize / sizeof(SInt32);
SInt32 *frame = audioBuffer.mData;
SInt32  signalInput[22050];
for( int i=0; i<bufferSize; i++ ) {
    SInt32 currentSample = frame[i];
    *(signalInput +i) = currentSample;
}

提取采样值并且似乎工作得非常好(signalinput应该是用于写入整数样本的目标向量)。 但把它们写回缓冲区仍然是个问题...... 我搜索了文档和很多论坛以找到解决方案,但还没有成功。

所以我非常感谢任何建议, 提前谢谢,卢卡斯

1 个答案:

答案 0 :(得分:4)

如果您想要实时修改音频,可能需要尝试使用RemoteIO Audio Unit。

使用音频队列时,您必须保存记录队列回调中的数据,然后将处理后的数据提供给播放队列回调,并在不同的时间进行不同的回调。为此,您可能必须使用中间队列或数据缓冲区。为了实现这一点,可能有助于尝试运行录制声音应用程序,然后运行示例播放应用程序,然后将两者结合起来。

补充:

以下是将示例值写入音频输出队列的一些源代码示例:

http://lists.apple.com/archives/coreaudio-api/2008/Dec/msg00173.html  https://bitbucket.org/ddribin/a440/wiki/Home

只需使用您自己的预处理样本而不是正弦波。