gpt4 book ai didi

iOS:音频处理所需的线程解决方案

转载 作者:行者123 更新时间:2023-11-29 11:18:23 27 4
gpt4 key购买 nike

我在 remoteIO 渲染回调中监控麦克风。

我运行一个简单的算法来检测是否检测到声音信号。

如果是,我开始记录到缓冲区,直到再次沉默。

一旦再次检测到静音,我需要告诉我的应用程序有一个声音缓冲区可供处理。该应用随后将执行处理。

重要的是这是在不同的线程上完成的! (remoteIO 渲染回调线程不能被阻塞,它是一个实时线程,它会卡住系统)。

我天真地假设我可以从我的渲染回调中发送一个 NSNotification,它会在不同的线程上被拾取。但这不会发生!它在同一个线程上执行。

完成此任务的简洁方法是什么?

我的感觉是我应该生成一个单独的线程。即使在主线程上进行处理似乎也有点小问题……它可能也需要四分之一秒,这足以导致一些 UX 人工制品。

最佳答案

我做过类似的事情,“简单”的答案是我创建一个串行调度队列,然后在音频单元渲染回调中获取数据并使用 dispatch_async 将新的音频数据传递到串行队列。我使用辅助队列,因为音频单元要求您在回调中花费尽可能少的时间——而且您不应该 malloc 内存或生成中断等。

这里 lockData 和 unlockData 获取预分配的 NSMutableData 对象,然后存储在锁定/解锁数组中。

//在你的初始化方法中

self.captureQueue = dispatch_queue_create("AudioCaptureQueue", NULL);

在渲染回调中:

__block NSMutableData * audiodata = [audioIO lockData];

status = AudioUnitRender(audioIO.audioUnit,
ioActionFlags,
inTimeStamp,
inBusNumber,
inNumberFrames,
&auBufferList);

dispatch_async(audioIO.captureQueue, ^{
[audioIO.sampleCaptureDelegate audioComponent:audioIO
hasSampleBuffer:audiodata];

[audioIO unlockData:audiodata];
});

在串行队列中,我对音频数据进行所有数据处理,然后当串行队列检测到它正在寻找的东西时,它可以使用

    dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:kAPPAudioQueueDidDetect
object:nil];
});

dispatch_get_main_queue 表示它在主线程上执行,因此您可以进行 UI 更新等操作!

关于iOS:音频处理所需的线程解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8397594/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com