gpt4 book ai didi

ios - 如何将 AUGraph 的输出写入文件?

转载 作者:可可西里 更新时间:2023-11-01 04:31:45 24 4
gpt4 key购买 nike

我正在尝试编写(应该是什么)一个简单的应用程序,该应用程序在 AUGraph 中按顺序包含一堆音频单元,然后将输出写入文件。我使用 AUGraphAddRenderNotify 添加了一个回调。这是我的回调函数:

OSStatus MyAURenderCallback(void *inRefCon,
AudioUnitRenderActionFlags *actionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData) {
if (*actionFlags & kAudioUnitRenderAction_PostRender) {
ExtAudioFileRef outputFile = (ExtAudioFileRef)inRefCon;
ExtAudioFileWriteAsync(outputFile, inNumberFrames, ioData);
}
}

这类作品。该文件可以播放,我可以听到我录制的内容,但是有大量的静电噪音几乎听不见。

有人知道这是怎么回事吗?或者有人知道将 AUGraph 输出记录到文件的更好方法吗?

感谢您的帮助。

最佳答案

我刚才对音频单元有了顿悟,这帮助我解决了自己的问题。我对音频单元连接和渲染回调的工作方式有误解。我认为它们是完全独立的东西,但事实证明连接只是渲染回调的简写。

从音频单元 A 的输出到音频单元 B 的输入执行 kAudioUnitProperty_MakeConnection 与在单元 B 的输入上执行 kAudioUnitProperty_SetRenderCallback 并在音频单元 A 的输出上调用 AudioUnitRender 的回调函数相同。

我通过在设置我的渲染回调后建立连接来测试这个并且渲染回调不再被调用。

因此,我能够通过执行以下操作来解决我的问题:

AURenderCallbackStruct callbackStruct = {0};
callbackStruct.inputProc = MyAURenderCallback;
callbackStruct.inputProcRefCon = mixerUnit;

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

我的回调函数做了这样的事情:

OSStatus MyAURenderCallback(void *inRefCon,
AudioUnitRenderActionFlags *actionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData) {

AudioUnit mixerUnit = (AudioUnit)inRefCon;

AudioUnitRender(mixerUnit,
actionFlags,
inTimeStamp,
0,
inNumberFrames,
ioData);

ExtAudioFileWriteAsync(outputFile,
inNumberFrames,
ioData);

return noErr;
}

这对我来说可能应该是显而易见的,但由于事实并非如此,我敢打赌其他人也以同样的方式感到困惑,所以希望这对他们也有帮助。

我仍然不确定为什么我在使用 AUGraphAddRenderNotify 回调时遇到问题。我稍后会深入研究这个问题,但现在我找到了一个似乎可行的解决方案。

关于ios - 如何将 AUGraph 的输出写入文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8951458/

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