ios - RemoteIO:影响应用程序产生的音频

标签 ios avfoundation core-audio audiounit remoteio

简而言之:有没有一种方法可以使用 RemoteIO 捕获/处理应用程序生成的所有音频?

我可以获得渲染回调,通过连接到 RemoteIO 的输入范围输出总线,我可以将音频发送到扬声器。但是我在该回调中的输入缓冲区不包含 AVPlayer 在应用程序其他地方产生的声音。甚至可以操纵所有应用程序音频吗?

这是我的设置:

-(void)setup
{
    OSStatus status = noErr;

    AudioComponentDescription remoteIODesc;
    fillRemoteIODesc(&remoteIODesc);
    AudioComponent inputComponent = AudioComponentFindNext(NULL, &remoteIODesc);

    AudioComponentInstance remoteIO;
    status = AudioComponentInstanceNew(inputComponent, &remoteIO);
    assert(status == noErr);

    AudioStreamBasicDescription desc = {0};
    fillShortMonoASBD(&desc);

    status = AudioUnitSetProperty(remoteIO,
                                  kAudioUnitProperty_StreamFormat,
                                  kAudioUnitScope_Input,
                                  0,
                                  &desc,
                                  sizeof(desc));
    assert(status == noErr);

    AURenderCallbackStruct callback;
    callback.inputProc = outputCallback;
    callback.inputProcRefCon = _state;

    status = AudioUnitSetProperty(remoteIO,
                                  kAudioUnitProperty_SetRenderCallback,
                                  kAudioUnitScope_Input,
                                  0,
                                  &callback,
                                  sizeof(callback));
    assert(status == noErr);

    status = AudioUnitInitialize(remoteIO);
    assert(status == noErr);

    status = AudioOutputUnitStart(remoteIO);
    assert(status == noErr);
}

最佳答案

简短回答:不,不幸的是,它不能那样工作。您将无法对通过 AVFoundation(从 iOS 6 开始)制作的音频添加任意处理。

您误解了 RemoteIO 单元的用途。 RemoteIO 让您可以访问 2 个东西:音频输入硬件和音频输出硬件。同样,您可以使用 RemoteIO 从麦克风获取音频,或将音频发送到扬声器。 RemoteIO 单元不允许您获取应用程序其他部分(例如 AVFoundation)发送到硬件的音频。不用太深入,这是因为 AVFoundation 不使用与 RemoteIO 相同的音频路径。

要在您想要的级别上操作音频,您将不得不比 AVFoundation 更深入。 Audio Queue Services是下一层,可以让您以音频队列处理分路器的形式访问音频。这可能是开始处理音频的最简单方法。不过,还没有太多关于它的文档。目前最好的来源可能是 header AudioToolbox.framework/AudioQueue.h 请注意,这仅在 iOS 6 中引入。

比这更深的是Audio Units .这是 RemoteIO 单元所在的位置。您可以使用 AUFilePlayer 从音频文件中产生声音,然后将该音频提供给其他音频单元进行处理(或自己处理)。这将比 AVFoundation(轻描淡写)更棘手/冗长,但如果您已经设置了 RemoteIO 单元,那么您可能可以处理它。

关于ios - RemoteIO:影响应用程序产生的音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13016853/

相关文章:

ios - 根据 Swift 中的文本大小调整 labelSize

ios - 如何在 UIViewController 中与 UITableView 进行交互?

ios - 返回 viewController 方向。 swift

objective-c - 需要一些帮助,有人知道为什么系统声音在 iPad 上不起作用但在 iPhone 上起作用吗?

ios - 如何使用 Swift 在后台播放音频?

ios - 使用 Swift 将 GIF 背景添加到 viewController

ios - AVFoundation 旋转屏幕 - Obj C

objective-c - 可以使用CoreAudio获取音频流数据到系统输出设备吗?

c++ - 编译 AudioUnit 时出现错误 "SysError 0 during open of "AUResources.r""

iphone - 峰值滤波器有咔哒声和爆裂声