首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS:音频处理所需的线程解决方案

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

Stack Overflow用户
提问于 2011-12-06 17:21:39
回答 1查看 1.7K关注 0票数 1

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

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

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

一旦再次检测到静默,我需要告诉我的应用程序有一个准备好处理的声音缓冲区。然后,应用程序将执行处理。

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

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2011-12-06 18:01:03

我已经做了类似的事情,简单的答案是我创建一个串行调度队列,然后在音频单元渲染回调中获取数据,并使用dispatch_async将新的音频数据传递到串行队列。我使用二级队列,因为音频单元需要你在回调中花费尽可能少的时间-而且你不应该malloc内存或产生中断之类的。

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

//在init方法中

代码语言:javascript
复制
self.captureQueue = dispatch_queue_create("AudioCaptureQueue", NULL);

在渲染回调中:

代码语言:javascript
复制
__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];
});

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

代码语言:javascript
复制
    dispatch_async(dispatch_get_main_queue(), ^{
        [[NSNotificationCenter defaultCenter] postNotificationName:kAPPAudioQueueDidDetect 
                                                            object:nil];
    });

dispatch_get_main_queue意味着它是在主线程上执行的,所以你可以做UI更新之类的事情!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8397594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档