在 iOS 上录制、修改和播放音频

2024-02-21

EDIT:最后,我完全按照下面的解释,使用 AVRecorder 来录制语音,使用 openAL 来进行音调转换和播放。效果很好。

我有一个关于录制、修改和播放音频的问题。我之前也问过类似的问题(在 iOS 上实时录制、修改音高和播放音频 https://stackoverflow.com/questions/4393415/iphone-record-modify-pitch-and-play-back-audio-in-real-time)但我现在有更多信息,可以提供一些进一步的建议。

首先,这就是我想要做的(在主线程的单独线程上):

  1. 监听 iPhone 麦克风
  2. 检查声音是否大于特定音量
  3. 如果高于阈值开始记录,例如人们开始说话
  4. 继续记录,直到音量低于阈值,例如人停止说话
  5. 修改录制声音的音调。
  6. 播放声音

我正在考虑使用 AVRecorder 来监听和录制声音,这里有很好的教程:http://mobileorchard.com/tutorial-detecting-when-a-user-blows-into-the-mic/ http://mobileorchard.com/tutorial-detecting-when-a-user-blows-into-the-mic/

我正在考虑使用 openAL 来修改录制音频的音高。

所以我的问题是,我在上面列出的几点中的想法是否正确,我是否遗漏了某些内容,或者是否有更好/更简单的方法来做到这一点。我可以避免混合音频库而只使用 AVFoundation 来改变音高吗?


您可以使用 AVRecorder 或诸如实时 IO 音频单元之类的较低版本。

“体积”的概念相当模糊。您可能想了解计算峰值和 RMS 值之间的差异,并了解如何在给定时间(例如 VU 表使用的 300 毫秒)内对 RMS 值进行积分。

基本上,您将所有值的平方相加。您可以使用 10 * log10f(sqrt(sum/num_samples)) 取平方根并转换为 dBFS,但您可以使用 20 * log10f(sum/num_samples) 一步完成,无需 sqrt。

您需要对积分时间和阈值进行大量调整,以使其按照您想要的方式运行。

对于音调变换,我认为 OpenAL 可以解决这个问题,其背后的技术称为频带限制插值 -https://ccrma.stanford.edu/~jos/resample/Theory_Ideal_Bandlimited_Interpolation.html https://ccrma.stanford.edu/~jos/resample/Theory_Ideal_Bandlimited_Interpolation.html

此示例显示了作为运行平均值的均方根计算。循环缓冲区保留了平方的历史记录,并且无需在每次操作时对平方求和。我还没有运行它,所以将其视为伪代码;)

Example:

class VUMeter
{

protected:

    // samples per second
    float _sampleRate;

    // the integration time in seconds (vu meter is 300ms)
    float _integrationTime;

    // these maintain a circular buffer which contains
    // the 'squares' of the audio samples

    int _integrationBufferLength;
    float *_integrationBuffer;
    float *_integrationBufferEnd;
    float *_cursor;

    // this is a sort of accumulator to make a running
    // average more efficient

    float _sum;

public:

    VUMeter()
    : _sampleRate(48000.0f)
    , _integrationTime(0.3f)
    , _sum(0.)
    {
        // create a buffer of values to be integrated
        // e.g 300ms @ 48khz is 14400 samples

        _integrationBufferLength = (int) (_integrationTime * _sampleRate);

        _integrationBuffer = new float[_integrationBufferLength + 1];
        bzero(_integrationBuffer, _integrationBufferLength);

        // set the pointers for our ciruclar buffer

        _integrationBufferEnd = _integrationBuffer + _integrationBufferLength;
        _cursor = _integrationBuffer;

    }

    ~VUMeter()
    {
        delete _integrationBuffer;
    }

    float getRms(float *audio, int samples)
    {
        // process the samples
        // this part accumulates the 'squares'

        for (int i = 0; i < samples; ++i)
        {
            // get the input sample

            float s = audio[i];

            // remove the oldest value from the sum

            _sum -= *_cursor;

            // calculate the square and write it into the buffer

            double square = s * s;
            *_cursor = square;

            // add it to the sum

            _sum += square;

            // increment the buffer cursor and wrap

            ++_cursor;

            if (_cursor == _integrationBufferEnd)
                _cursor = _integrationBuffer;
        }

        // now calculate the 'root mean' value in db

        return 20 * log10f(_sum / _integrationBufferLength);
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 iOS 上录制、修改和播放音频 的相关文章

随机推荐

  • 具有文化格式的双重解析

    我有一个双数作为字符串 号码是 202 667 40 这是202667 4 我如何解析这个字符串来获取值 例如 Double Parse 202 667 40 这里是什么 或者任何其他获取值的方法都会很棒 谢谢 首先 你需要知道这个号码来自
  • Cassandra 复制系统 - 工作原理

    Cassandra 是否仅在写入过程中进行复制 具有选定的一致性级别 如果我希望每个节点中都有对称数据 是否有针对缺失节点的自动复制选项 如果我将新节点插入集群 则不会自动复制 如何将其他节点的数据与新节点同步 如果我想要像多主机 2 个节
  • 如何让textview闪烁

    伙计们 我有一个文本视图 我需要它闪烁 请帮助我
  • 如何使用 Mootools 更改背景图像 css 属性?

    我是新手 如何使用 Mootools 更改我的背景图像 css 属性 例如 在页面加载时 div div
  • Espresso 测试,单击 X/Y 坐标

    知道如何为 Android 做到这一点吗 我似乎无法创建一个真正点击的方法 我知道你可以用 onview 做到这一点 但我只想要一个 x y 位置 答案已经给出here https stackoverflow com a 22798043
  • FireFox 中的 Selenium OpenQA.Selenium.DriverServiceNotFoundException

    我正在尝试开始编写 Selenium 测试 我编写的第一个非常基本的测试失败了 但有例外OpenQA Selenium DriverServiceNotFoundException using OpenQA Selenium using O
  • 获取月份为 01,02 而不是 1,2

    我正在使用 Calendar 类 更具体地说 我需要以两个数字的形式返回所有 12 个月 如果我使用以下代码 int month myCalendar get Calendar MONTH 1 这是我在不同月份得到的结果 1 2 3 4 5
  • Linux 内核 2.6.18 中的 sys_call_table

    我试图通过以下方式将系统退出调用设置为变量 extern void sys call table real sys exit sys call table NR exit 但是 当我尝试制作时 控制台给出了错误 error NR exit
  • Groovy 的尾递归

    我编写了 3 个阶乘算法 我预计会因堆栈溢出而失败 没问题 我尝试尾递归调用 并将以前的算法从递归转换为迭代 它不起作用 但我不明白为什么 I use trampoline 方法 效果如我所料 def factorial factorial
  • “fork()”后 printf 异常

    操作系统 Linux 语言 纯C 我正在继续学习一般的 C 编程 以及特殊情况下 UNIX 下的 C 编程 我发现了一个奇怪的 对我来说 行为printf 使用后的功能fork call Code include
  • 如果 pandas 中包含子字符串,则替换整个字符串

    我想替换包含特定子字符串的所有字符串 例如 如果我有这个数据框 import pandas as pd df pd DataFrame name Bob Jane Alice sport tennis football basketball
  • 使用 MVVM 将窗口句柄传递给 WPF 中的视图模型

    我正在使用需要窗口句柄的外部库 我的应用程序架构是 MVVM 但外部库并不完全适合该架构 我认为视图模型是调用需要窗口句柄的初始化函数的最合适的地方 如何将窗口句柄从我的视图获取到我的视图模型 通常 您的视图模型不应该了解视图的实现细节 例
  • jquery定时器实现

    All 是否有一个 jQuery 计时器可以启动 20 分钟的计时器并显示经过的时间 请指出它的一个小代码 var austDay new getTime austDay new getSeconds austDay var duratio
  • 使用 GCC 的软件流水线示例

    我正在寻找软件管道的真实 源代码和生成代码 示例 http en wikipedia org wiki Software pipelined http en wikipedia org wiki Software pipelining 由海
  • Excel - 获取列的前 5 个数据及其匹配的标题,但会产生重复项

    我正在开发一个使用 PHP 以 CodeIgniter 作为框架 制作的 Web 应用程序 它应该生成一个 excel 文件报告作为数据摘要 我使用 PHPSpreadsheet 作为库来生成 xlsx 文件 一切都很成功 我能够在单元格的
  • 即使作业成功完成后,内存使用量也不会降低

    我在 apscheduler 中添加了一项作业 该作业会在内存中加载一些数据 并在作业完成后删除所有对象 现在 如果我使用 python 运行此作业 它会成功运行 并且在进程成功退出后内存会下降 但是在 apscheduler 的情况下 内
  • 为什么 React Router v6 似乎无法从 URL 中删除查询字符串参数?

    我有一个应用程序 有时会加载查询字符串参数t 一开始 我希望应用程序读取此参数 如果可用 并将其从 URL 中删除 在根组件上 我正在这样做 const searchParams setSearchParams useSearchParam
  • 使用 Rails 在 Net::HTTP::Get.new 中设置自定义超时

    我正在使用此代码来抓取外部 html 文件 link URI parse url request Net HTTP Get new link path response Net HTTP start link host link port
  • iPhone:无法让模拟器生成 .gcda 分析数据文件

    我正在尝试使用 iPhone 模拟器分析我的代码 我已启用生成测试覆盖率文件 and 仪器程序流程并添加了 lgcov到链接器标志 根据我读过的所有内容 这应该是我在设置方面需要做的全部事情 Update 生成测试覆盖率文件触发 f测试覆盖
  • 在 iOS 上录制、修改和播放音频

    EDIT 最后 我完全按照下面的解释 使用 AVRecorder 来录制语音 使用 openAL 来进行音调转换和播放 效果很好 我有一个关于录制 修改和播放音频的问题 我之前也问过类似的问题 在 iOS 上实时录制 修改音高和播放音频 h