如何在iPhone应用程序中切换扬声器和耳机

时间:2010-04-18 14:44:16

标签: ios objective-c audio avaudioplayer playback

我写过一个使用AVAudioPlayer播放音频的应用程序。

我已经实现了一个将音频切换到扬声器的功能:

UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);    
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);

但是当我尝试使用它将其切换回耳机时:

UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);    
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride); 

它仍然通过扬声器发出。

我找不到任何其他指导音频的方式。任何人都可以建议我做错了吗?

2 个答案:

答案 0 :(得分:4)

根据Apple's documentation,仅在使用kAudioSessionCategory_PlayAndRecord类别时才能使用音频会话路由覆盖。

您可以尝试将类别更改为kAudioSessionCategory_PlayAndRecord,然后使用kAudioSessionProperty_OverrideCategoryDefaultToSpeaker属性键将音频路由到扬声器。

答案 1 :(得分:0)

就像Laurent所说的那样,尝试使用PlayAndRecord:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride);

使用AVAudioSessionCategoryPlayAndRecord非常重要,否则路线将无法转到演讲者。一旦为音频会话设置了覆盖路由,就可以使用AVAudioPlayer实例并将一些输出发送给扬声器。

希望对我这样的人有用。关于此的文档是分散的,但Skype应用证明它是可能的。坚持不懈,我的朋友们! :)

这里有一些Apple文档:http://developer.apple.com/library/ios/#documentation/AudioToolbox/Reference/AudioSessionServicesReference/Reference/reference.html

在页面上搜索kAudioSessionProperty_OverrideAudioRoute