简而言之:有没有办法使用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);
}
答案 0 :(得分:2)
简短的回答:不,不幸的是,它并没有这样做。您无法通过AVFoundation(从iOS 6开始)为您生成的音频添加任意处理。
您误解了RemoteIO设备的用途。 RemoteIO使您可以访问两件事:音频输入硬件和音频输出硬件。如同,您可以使用RemoteIO从麦克风获取音频,或将音频发送到扬声器。 RemoteIO设备不会让您抓取应用程序的其他部分(例如AVFoundation)发送到硬件的音频。没有深入研究,这是因为AVFoundation没有使用与RemoteIO一起使用的相同音频路径。
要在您想要的级别上操作音频,您将不得不比AVFoundation更深入。 Audio Queue Services是下一层,可让您以音频队列处理分流的形式访问音频。这可能是开始处理音频的最简单方法。但是,它还没有太多的文档。可能目前最好的来源是标题AudioToolbox.framework/AudioQueue.h
请注意,这仅在iOS 6中引入。
比Audio Units更深。这是RemoteIO单元所在的位置。您可以使用AUFilePlayer从音频文件生成声音,然后将该音频提供给其他音频单元进行处理(或自己动手)。这比AVFoundation(轻描淡写)更加棘手/冗长,但如果您已经设置了RemoteIO单元,那么您可以处理它。