【发布时间】:2014-08-12 08:36:54
【问题描述】:
我有 2 种不同品牌的吉他适配器,它们使用闪电连接器连接到我的 iPhone
当适配器 1 插入时,设备变成一个 USB 音频麦克风,并通过我 iPhone 的扬声器播放声音,因为适配器不包含耳机插孔
当适配器 2 插入时,设备变成一个 USB 音频麦克风,但通过适配器上的耳机插孔播放声音。
我正在尝试编写一个适用于适配器 2 的应用程序,但我不想将声音输出到适配器的耳机插孔,而是想通过 iPhone 的扬声器进行路由。
下面的代码应该可以工作,但我发现使用 AVAudioSessionPortOverrideSpeaker 选项调用 AVAudioSessionPortOverride 并且音频会话的类别是 AVAudioSessionCategoryPlayAndRecord 会导致音频使用内置扬声器和麦克风,而不管其他设置,基本无视setPreferredInput
我不太明白适配器 1 如何设法从 USB 音频获取输入并输出到扬声器,但由于上述限制,我的应用程序不能。有人知道解决方案吗?
AVAudioSession* session = [AVAudioSession sharedInstance];
//Set the audioSession category. Needs to be Record or PlayAndRecord to use audioRouteOverride:
[session setCategory:AVAudioSessionCategoryPlayAndRecord
withOptions:AVAudioSessionCategoryOptionMixWithOthers
error:nil];
//set the audioSession override
[session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
error:nil];
//activate the audio session
[session setActive:YES error:nil];
//set input to usb
for (AVAudioSessionPortDescription *destPort in session.availableInputs){
if ([destPort.portType isEqualToString:AVAudioSessionPortUSBAudio]) {
[setPreferredInput:(AVAudioSessionPortDescription *)inPort
error:(nil)outError
session setPreferredInput:destPort error:nil];
}
}
【问题讨论】:
-
你能把
session.availableInputs的日志放上去吗? -
adapter1 只能输入吗?
-
是的,它只能向iOS设备输入音频
-
你检查错误参数是否显示了什么?
-
我认为您发布的代码中有些东西混淆了,可能是在格式化期间。最后一条语句包含两次 setPreferredInput,所以这里的语法看起来是错误的:[setPreferredInput:(AVAudioSessionPortDescription *)inPort error:(nil)outError session setPreferredInput:destPort error:nil];
标签: ios iphone objective-c avfoundation avaudiosession