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

Posted

技术标签:

【中文标题】如何从音频队列缓冲区中提取整数样本并将修改后的样本写回?【英文标题】:How to extract integer samples from audio queue buffer and write modified samples back? 【发布时间】:2011-01-28 15:40:24 【问题描述】:

对于 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;

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

所以我非常感谢任何建议, 在此先感谢,卢卡斯

【问题讨论】:

【参考方案1】:

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

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

添加:

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

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

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

【讨论】:

感谢您的快速回复。 - 录音部分已经开始工作了。例如,我想以某种方式更改回调以修改记录的样本,然后再将它们写入文件。无论如何,有没有可能,如果有的话,我怎样才能直接访问音频缓冲区的记录样本(无论是音频队列还是音频单元)。 确保你指定、获取和使用的PCM数据类型都是一致的。您要求的是 16 位还是 32 位样本?整数还是浮点数?大端还是小端?等 好的,谢谢。生病立即检查。但基本上,上面声明的函数是对的?!如果是这种情况,我该如何将值(曾经的类型......)写回音频缓冲区。我在任何地方都找不到任何示例代码...?

以上是关于如何从音频队列缓冲区中提取整数样本并将修改后的样本写回?的主要内容,如果未能解决你的问题,请参考以下文章

如何从音频文件中获取样本的浮点数组

如何从 iOS 中的音频剪辑中检索 PCM 样本数据?

iOS,音频队列:缓冲区大小不是恒定的

如何获得 3sn 的音频缓冲区 ios

Assembly 音频合成的数据结构

哪个 API 从 ios 和 osx 中的缓冲区播放音频?