如何通过内置听筒扬声器播放音频

Posted

技术标签:

【中文标题】如何通过内置听筒扬声器播放音频【英文标题】:How to play audio through built-in earpiece speaker 【发布时间】:2015-07-29 06:17:09 【问题描述】:

我看到一些应用程序,如 WhatsApp,具有仅在用户将设备靠近耳朵时通过听筒(电话扬声器)播放音频剪辑的功能。否则通过普通的内置扬声器播放。

我正在使用 MPMoviePlayer 播放音频剪辑。

我确实在互联网上浏览了很多类似的问题和答案,所有答案都说将 Audiosession Category 设置为 PlayAndRecord。就是这样。

我做了同样的事情,但无法得到我想要得到的确切结果。

// Audio Player
self.audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
[audioSession setActive:YES error:nil];
self.moviePlayer = [[MPMoviePlayerController alloc] init];
self.moviePlayer.view.hidden = YES;

//    AVAudioSessionPortDescription *routePort = self.audioSession.currentRoute.outputs.firstObject;
//    NSString *portType = routePort.portType;
//    
//    if ([portType isEqualToString:@"Receiver"]) 
//        [self.audioSession  overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
//     else 
//        [self.audioSession  overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:nil];
//    

谁能告诉我如何以及在哪里修改源以仅在用户打开设备时通过听筒扬声器播放音频?

【问题讨论】:

那是我关注的那个。但对我不起作用。请查看已编辑的问题,我已经发布了完整的源代码 我可以使用 AVAudioSession 和 ProximityMoniting 来解决它。我发布了答案 【参考方案1】:

我可以使用 AVAudioSession 和 ProximityMoniting 来做到这一点

- (void)viewDidLoad 
    [super viewDidLoad];

    [UIDevice currentDevice].proximityMonitoringEnabled = YES;

    if ([UIDevice currentDevice].proximityMonitoringEnabled == YES) 
        [[NSNotificationCenter defaultCenter] addObserver:self
                                               selector:@selector(proximityChanged:)
                                                     name:@"UIDeviceProximityStateDidChangeNotification"
                                               object:[UIDevice currentDevice]];
    



- (void) proximityChanged:(NSNotification *)notification 
    UIDevice *device = [notification object];
    NSLog(@"In proximity: %i", device.proximityState);

    if(device.proximityState == 0)
        [audioSession  overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
    
    else
        [audioSession  overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:nil];
    

播放音频

audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
[audioSession setActive:YES error:nil];

AVAudioSessionPortDescription *routePort = audioSession.currentRoute.outputs.firstObject;
NSString *portType = routePort.portType;

NSLog(@"PortType %@", portType);

if ([portType isEqualToString:@"Receiver"]) 
    [audioSession  overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];

【讨论】:

你能检查一下这个***.com/questions/45424446/…

以上是关于如何通过内置听筒扬声器播放音频的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 通过 iPhone 扬声器强制播放音频文件

iPhone音频播放:强制通过内部扬声器?

iOS 音频 耳机与扬声器切换

iOS 无法在扬声器上播放并将音频会话设置为录制

iOS音频掌柜-- AVAudioSession

JavaScript - 如何选择音频播放?