【问题标题】:AVAudioUnit (render) callbackAVAudioUnit(渲染)回调
【发布时间】:2014-08-06 15:14:59
【问题描述】:

我正在尝试使用新的 AVAudioUnits / AVAudioNodes 进行一些音频处理。由于 AVAudioUnits 暴露了它们的底层(经典 CA)AudioUnit,我假设我可以像往常一样简单地附加一个渲染回调,但回调永远不会被调用。

这是我正在谈论的代码:

AVAudioUnitReverb *reverbUnit = [[AVAudioUnitReverb alloc] init];

AURenderCallbackStruct renderCallbackStruct;
renderCallbackStruct.inputProc = &myRenderCallback;
renderCallbackStruct.inputProcRefCon = myAudioStruct;

AudioUnitSetProperty(reverbUnit.audioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, 0, &renderCallbackStruct, sizeof(renderCallbackStruct));

并且渲染回调看起来基本如下:

OSStatus myRenderCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) {
    printf("callback!");
    return noErr;
}

reverbUnit 当然是连接到引擎 (PlayerNode -> Reverb -> MainMixer) 上的,我可以按预期听到播放器的音频(混响)。

注意:当我通过设置回调时

AudioUnitAddRenderNotify(reverbUnit, &myRenderCallback, myAudioStruct)

它被调用了,但是ioData->mBuffers[0].mData 为 nil(这是正确的 AFAIK),所以这不是替代方案。

【问题讨论】:

  • 不要使用 printf 或 NSLog 等任何打印功能。这是一个性能瓶颈。
  • 是的,谢谢,我知道了。但这不是这里的问题。真正的回调显然不会是这样的。

标签: objective-c cocoa core-audio ios8 audiounit


【解决方案1】:

在 AUGraph 中连接混响单元的输入节点会覆盖渲染回调。混响节点只能有一个输入,输入节点或渲染回调。

【讨论】:

  • 希望主题:可以创建一个带有自定义回调的 AVAudioUnit 以在 AVAudioEngine 中使用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多