简而言之:有没有一种方法可以捕获/处理使用RemoteIO的应用程序产生的所有音频?
我可以获得render回调,它允许我通过连接到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);
}发布于 2012-10-30 01:44:49
简短的回答:不,不幸的是,它不是这样工作的。您将不能对通过AVFoundation (从iOS 6开始)生成的音频添加任意处理。
你误解了RemoteIO单位的用途。RemoteIO为您提供了两项功能:音频输入硬件和音频输出硬件。在中,您可以使用RemoteIO从麦克风获取音频,或将音频发送到扬声器。RemoteIO单元不允许你抓取你的应用程序的其他部分(例如AVFoundation)发送到硬件的音频。不太深入,这是因为AVFoundation不使用与RemoteIO相同的音频路径。
要在你想要的级别上操作音频,你必须比AVFoundation更深入。Audio Queue Services是下一层,它将使您能够以音频队列处理Tap的形式访问音频。这可能是开始处理音频的最简单方法。不过,目前还没有太多关于它的文档。也许目前最好的来源是头AudioToolbox.framework/AudioQueue.h注意,这只是在iOS 6中引入的。
比这更深的是Audio Units。这就是RemoteIO单元所在的位置。您可以使用AUFilePlayer从音频文件中产生声音,然后将该音频馈送到其他音频单元进行处理(或者自己处理)。这将比AVFoundation (轻描淡写)更棘手/冗长,但如果您已经设置了一个RemoteIO单元,那么您可能可以处理它。
https://stackoverflow.com/questions/13016853
复制相似问题