【问题标题】:How do you force audio to come out of the iPhone speaker when a headset is attached?连接耳机后,如何强制音频从 iPhone 扬声器中发出?
【发布时间】:2023-04-09 14:41:01
【问题描述】:

我正在尝试将扬声器功能添加到我的一个 iPhone 应用程序中。我已经创建了录音功能,但是当我播放录制的音频时,它只会播放到手机耳机。

我需要的是要在扬声器上播放的录制文件,即使连接了耳机。我怎样才能重新路由音频来做到这一点?

【问题讨论】:

  • 如果用户想使用扩音器或耳机,我如何创建一个设置来获得两者...谢谢..对不起,我错过了这部分..:P

标签: iphone cocoa-touch core-audio


【解决方案1】:

您需要使用AudioSessionSetProperty 覆盖默认音频属性。看看这样的东西来强制所有音频进入扬声器(请注意,即使插入耳机也会发生这种情况)。

OSStatus err = 0;
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
err = AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute,sizeof(audioRouteOverride),&audioRouteOverride);

要检测耳机,试试这个(这实际上是从另一个 SO 帖子中复制/粘贴代码,所以请注意,但它对我有用):

/**
 * Tells us if the headset is plugged in
 */
- (BOOL) headsetIsPluggedIn
{
  BOOL returnVal = NO;

  UInt32 routeSize = sizeof(CFStringRef);
  CFStringRef route = NULL;
  OSStatus error = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &routeSize, &route);
  if (!error && (route != NULL) && ([(NSString*)route rangeOfString:@"Head"].location != NSNotFound))
  {
    CFRelease(route);
    returnVal = YES;
  }
  return returnVal;
}

编辑: cmets 中有一些关于 CFRelease 是否合适的讨论。有没有核心基金会的核心专家愿意参与进来?

【讨论】:

  • 如果用户想使用扬声器或耳机,我如何创建一个设置来同时获得两者...谢谢..抱歉我错过了这部分..:P
  • hie phooze .. 我应该把代码 osstatus 放在哪里.. 对不起,我对所有这些都是新的..
  • @shy- 你把它放在你想要覆盖的地方吗?
  • 如果route 字符串不包含@"Head",它将泄漏。否则,很好,我不知道你可以用 iOS SDK 做到这一点。
  • @Daniel - 我最初将它放在返回旁边,但是当没有插入耳机时我崩溃了。我认为它会返回为 NULL 否则?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多