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

Luk*_*kas 5 iphone buffer sample objective-c 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

hot*_*aw2 4

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

使用音频队列时,您必须保存来自录制队列回调的数据,然后在不同时间的不同回调中将处理后的数据提供给播放队列回调。为此,您可能必须使用中间队列或数据缓冲区。为了使其正常工作,尝试运行一个录音应用程序,然后运行一个示例播放应用程序,然后将两者结合起来可能会有所帮助。

添加:

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

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

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