如何通过扬声器切换音频输出?

时间:2014-04-07 09:12:25

标签: ios iphone ios7 avaudioplayer avaudiosession

我似乎无法找到有关此主题的任何有用信息。

使用AVAudioPlayer时,应用随机开始通过扬声器(听筒)而不是扬声器播放音频。发生这种情况时,即使是使用耳机直接通过UIWebView播放从YouTube直播的YouTube视频。

有谁知道如何切换输出源?

2 个答案:

答案 0 :(得分:2)

即使插入了耳机,也无法通过iPhone扬声器播放音频文件?

但我们可以得到关于何时插入或输出输出设备的通知,因此我们可以做我们的事情。 以下是供您参考的代码。

void audioRouteChangeListenerCallback (void *inUserData, AudioSessionPropertyID inPropertyID, UInt32 inPropertyValueSize, const void *inPropertyValue) {
if (inPropertyID != kAudioSessionProperty_AudioRouteChange) return;

MPMusicPlayerController *controller = (__bridge MPMusicPlayerController *)inUserData;

CFDictionaryRef routeChangeDictionary = inPropertyValue;

CFNumberRef routeChangeReasonRef = CFDictionaryGetValue(routeChangeDictionary, CFSTR (kAudioSession_AudioRouteChangeKey_Reason));
SInt32 routeChangeReason;
CFNumberGetValue (routeChangeReasonRef, kCFNumberSInt32Type, &routeChangeReason);

CFStringRef oldRouteRef = CFDictionaryGetValue(routeChangeDictionary, CFSTR (kAudioSession_AudioRouteChangeKey_OldRoute));
NSString *oldRouteString = (__bridge NSString *)oldRouteRef;

if (routeChangeReason == kAudioSessionRouteChangeReason_OldDeviceUnavailable) {
    if ((controller.playbackState == MPMusicPlaybackStatePlaying) &&
        (([oldRouteString isEqualToString:@"Headphone"]) ||
         ([oldRouteString isEqualToString:@"LineOut"])))
    {
        // Janking out the headphone will stop the audio.
        [controller pause];
    }
}

答案 1 :(得分:0)

如果您还使用麦克风进行录制,请按照以下方法将输出设备切换回扬声器/耳机而不是听筒(Swift 4):

do {
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryMulti)
} catch let error {
    print("\(error.localizedDescription)")
}

我发现AVAudioSessionCategoryMultiAVAudioSessionCategoryPlayAndRecord的效果更好,因为后者默认输出到听筒而不是扬声器,但是当您启用麦克风时,它也是默认类别。 >