【发布时间】:2015-07-20 10:22:57
【问题描述】:
此时我有一个简单的需求,一个 iOS 应用程序,它从音频文件中读取并使用 AudioUnits 输出到扬声器。不使用高级 API 的原因是,在某些时候,我需要处理来自音频文件的样本并最终通过网络发送它。
我有一个可以工作的代码,它可以读取音频文件并播放到扬声器。这里唯一的问题是,渲染回调不起作用。回调永远不会被调用,注册时我也不会收到任何错误。非常感谢您的帮助(我是 Core Audio 的初学者,这是我在 stackoverflow 上的第一个问题,所以请原谅任何基本的错误/忽略)。附上我用于初始化图形的代码。
void createMyAUGraph (MyAUGraphPlayerST *player) {
// Create a new AUGraph
CheckError(NewAUGraph(&player->graph), "New AUGraph failed");
// Generate description for output
AudioComponentDescription outputcd = {0};
outputcd.componentType = kAudioUnitType_Output;
outputcd.componentSubType = kAudioUnitSubType_RemoteIO;
outputcd.componentManufacturer = kAudioUnitManufacturer_Apple;
outputcd.componentFlags = 0;
outputcd.componentFlagsMask = 0;
// Add new node
AUNode outputNode;
CheckError(AUGraphAddNode(player->graph, &outputcd, &outputNode), "Add output node failed");
// Node for file player
AudioComponentDescription fileplayercd = {0};
fileplayercd.componentType = kAudioUnitType_Generator;
fileplayercd.componentSubType = kAudioUnitSubType_AudioFilePlayer;
fileplayercd.componentManufacturer = kAudioUnitManufacturer_Apple;
// Add new node
AUNode fileNode;
CheckError(AUGraphAddNode(player->graph, &fileplayercd, &fileNode), "Add file node failed");
// Open graph
CheckError(AUGraphOpen(player->graph), "Graph open failed");
// Retrive AudioUnit
CheckError(AUGraphNodeInfo(player->graph, outputNode, NULL, &player->outputAU), "file unit retrive failed");
CheckError(AUGraphNodeInfo(player->graph, fileNode, NULL, &player->fileAU), "file unit retrive failed");
// connect nodes
CheckError(AUGraphConnectNodeInput(player->graph, fileNode, 0, outputNode, 0), "failed to connect nodes");
// some other setup
UInt32 flag = 1;
CheckError(AudioUnitSetProperty(player->outputAU,
kAudioOutputUnitProperty_EnableIO,
kAudioUnitScope_Output,
0,
&flag,
sizeof (flag)), "Set io property failed");
// Register render callback
AURenderCallbackStruct output_cb;
output_cb.inputProc = recording_cb;
output_cb.inputProcRefCon = player;
CheckError(AudioUnitSetProperty(player->outputAU, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, 0, &output_cb, sizeof (output_cb)), "callback register failed");
// initialize graph
CheckError(AUGraphInitialize(player->graph), "graph initialization failed");
}
【问题讨论】:
-
渲染回调在哪里?
-
您的音频会话类别是什么?
-
嗨,马特,我正在尝试使用没有 AudioSession 的 AudioUnits。根据我浏览的一些文档,我的理解是,它们可以独立使用。音频文件的读取和播放按预期工作,我只是无法获得样本。我是否需要设置 AudioSession 才能使回调起作用?渲染回调没有被调用,因此我没有在这里包含代码。
标签: ios callback core-audio audiounit