如何在将音频缓冲区发送到扬声器之前获取它们?

Posted

技术标签:

【中文标题】如何在将音频缓冲区发送到扬声器之前获取它们?【英文标题】:How to grab audio buffers before sending them to speaker? 【发布时间】:2016-07-04 10:13:07 【问题描述】:

我是Core Audio,AudioUnit框架的菜鸟,对它了解不多,请多多包涵。

我有一个要求,我需要使用 webRTC 访问通过远程调用来的实时流。在 webRTC 框架中,无法访问音频流。

所以,我的想法是通过 Apple 音频框架访问该音频流,我正在考虑在将音频发送到扬声器之前获取音频。是否可以在发送到扬声器之前获取音频缓冲区。

我必须用一些值修改音频缓冲区并将其发送回扬声器。

请帮忙!

【问题讨论】:

您可以在这里获得很多帮助,但需要多描述一下您的问题和您的努力。当然你可以抓取缓冲区并修改它们,但方法取决于你的音频处理链的构造。如果您是 CA 的新手,这个textbook 可能有助于通过工作示例代码阐明基本概念以供学习。 【参考方案1】:

您可以设置渲染回调以输出 AudioUnit 并在发送到扬声器之前修改音频缓冲区。

AURenderCallbackStruct callbackStruct;
        callbackStruct.inputProc = inputRemoteRenderCallback;
        callbackStruct.inputProcRefCon = sourceUnit;


        AudioUnitSetProperty(outputAudioUnit,
                             kAudioUnitProperty_SetRenderCallback,
                             kAudioUnitScope_Input,
                             0,
                             &callbackStruct,
                             sizeof(callbackStruct));

和回调:

static OSStatus inputRemoteRenderCallback  (void *inRefCon,
                                       AudioUnitRenderActionFlags *ioActionFlags,
                                       const AudioTimeStamp *inTimeStamp,
                                       UInt32 inBusNumber,
                                       UInt32 inNumberFrames,
                                       AudioBufferList *ioData
                                       ) 

AudioUnit au = (AudioUnit)inRefCon;

AudioUnitRender(au,
                ioActionFlags,
                inTimeStamp,
                0,
                inNumberFrames,
                ioData);

return noErr;

【讨论】:

以上是关于如何在将音频缓冲区发送到扬声器之前获取它们?的主要内容,如果未能解决你的问题,请参考以下文章

您如何找到音频延迟? (Windows/OSX)

核心音频指导/入门

如何将 iPhone 音频路由到蓝牙扬声器

在 UWP 应用中使用 AudioGraph 将音频输出发送到两台设备

如何获取可用输出音频源列表(扬声器、耳机、蓝牙)

从缓冲区数据中创建一个 .caf 文件