2012-07-20 38 views
1

我正在为iPhone构建一个录音应用程序,其中使用了远程音频单元。音频单元录制:增加缓冲区的数量

ExtAudioFileWriteAsync

然而,这个问题我已经是记录的缓冲区是安静的,比我想:对进入缓冲区一些音频分析后,我用写缓冲区写入磁盘。

我想通过在写入磁盘之前手动将它们乘以一个音量因子来增加缓冲区的音量。任何人都可以请向我解释做到这一点的最佳方式?

(出于各种原因,在最后阶段的手动调整是不是改变任何音频单元属性的,这对于我的应用程序,否则工作良好更具吸引力。)预先

谢谢!

+0

你知道你想要多少收益?你知道这个数量的增益不会导致剪辑吗?你的数据的格式是什么? (线性16位或?)。你在寻找什么质量水平的增益调整? – hotpaw2 2012-07-20 21:22:17

+0

该缓冲区原本是线性的16位,我转换为浮动的音频分析阶段。然而,最后我写了原始的,不引人注目的AudioBufferList,因为这是有效的方法。但是,我想我现在需要将调整后的缓冲区版本返回到AudioBufferList中,以便可以使用该函数进行编写。削波发生在什么水平?有没有比简单复制更好的增益调整质量?谢谢! – Spinoxa 2012-07-23 08:51:54

回答

0

你可能会想到这个问题。 :-)您只需循环缓冲区中的值并将每个值乘以所需的增益因子即可。

+0

如果只有Core Audio非常简单! – Spinoxa 2012-07-23 08:47:26

5

您可以使用Accelerate.framework快速轻松地完成此操作。由于您使用AudioUnits我假设你已经去交织的浮动缓冲区所以这样的事情应该工作:

float desiredGain = 1.06f; // or whatever linear gain you'd like 
AudioBufferList *ioData; // audio from somewhere 
for(UInt32 bufferIndex = 0; bufferIndex < ioData->mNumberBuffers; ++bufferIndex) { 
    float *rawBuffer = (float *)ioData->mBuffers[bufferIndex].mData; 
    vDSP_Length frameCount = ioData->mBuffers[bufferIndex].mDataByteSize/sizeof(float); // if you don't have it already 
    vDSP_vsmul(rawBuffer, 1, &desiredGain, rawBuffer, 1, frameCount); 
} 
+0

非常感谢 - vDSP_vsmul似乎是我需要的功能。然而,我现在正努力将调整后的缓冲区(当前浮动)返回到AudioBufferList中,以便可以使用ExtAudioFileWriteAsync编写它。任何你可以向我解释的可能性......然后你将正式成为我的英雄! – Spinoxa 2012-07-23 08:35:19

+0

我得到一行错误float * rawBuffer = .....:无法用'void *'类型的Ivalue初始化'float *'类型的变量。任何想法如何解决这个问题?谢谢! – Spinoxa 2012-07-23 08:52:49

+0

您需要将'mData'强制转换为正确的类型。我在Chrome中编写代码,所以我没有编译它来检查 - 我添加了类型转换。 – sbooth 2012-07-23 11:15:23