音频单元录制:增加缓冲区的音量

Posted

技术标签:

【中文标题】音频单元录制:增加缓冲区的音量【英文标题】:Audio Unit recording: increased volume of buffers 【发布时间】:2012-07-20 06:14:05 【问题描述】:

我正在为我使用远程音频单元的 iPhone 构建一个录音应用程序。在对传入缓冲区执行一些音频分析后,我使用以下方法将缓冲区写入磁盘:

ExtAudioFileWriteAsync

但是,我遇到的问题是记录的缓冲区比我想要的要安静。

我想通过在写入磁盘之前手动将缓冲区乘以体积因子来增加缓冲区的体积。谁能给我解释一下最好的方法吗?

(由于各种原因,在最后阶段进行手动调整比更改任何音频单元属性更有吸引力,否则这对我的应用程序来说效果很好。)

提前致谢!!

【问题讨论】:

你知道你想要多少收益吗?你知道这个增益量不会导致削波吗?你的数据格式是什么? (线性 16 位或?)。您在寻找什么质量级别的增益调整? 缓冲区最初是线性的 16 位,我在音频分析阶段将其转换为浮点数。但是,最后我编写了原始的、未发现的 AudioBufferList,因为这是行之有效的方法。但是,我认为我现在需要将调整后的缓冲区版本返回到 AudioBufferList 中,以便可以使用该函数编写它。削波发生在什么水平?有没有比简单的乘法更好的增益调整质量?谢谢! 【参考方案1】:

您可以使用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);

【讨论】:

非常感谢 - vDSP_vsmul 似乎是我需要的功能。但是,我现在正在努力将调整后的缓冲区(当前浮动)返回到 AudioBufferList 中,以便可以使用 ExtAudioFileWriteAsync 写入它。你可以向我解释的任何可能性......然后你将正式成为我的英雄! 我在 float * rawBuffer = ..... 行收到错误:无法使用“void *”类型的 Ivalue 初始化“float *”类型的变量。知道如何解决这个问题吗?谢谢! 您需要将mData 转换为正确的类型。我在 Chrome 中编写了代码,所以我没有编译它来检查 - 我已经添加了类型转换。 英雄身份正式公布!谢谢哥们! 录音现在声音更大,但失真严重:(有什么想法吗?【参考方案2】:

你可能想多了这个问题。 :-) 您只需要遍历缓冲区中的值并将每个值乘以所需的增益因子。

【讨论】:

如果 Core Audio 这么简单就好了! 嗨,特定的频率增益如何?

以上是关于音频单元录制:增加缓冲区的音量的主要内容,如果未能解决你的问题,请参考以下文章

iOS:增加录制音频的音量

如何控制(音频缓冲区)AudioContext() 的音量?

在 iOS 上使用音频单元混合多个信号

如何增加使用AVAudioRecorder录制的声音音量

每 10 毫秒录制一次音频的音频缓冲区大小和 FFT 大小是多少?

使用前置摄像头录制视频时分别获取视频和音频缓冲区