【问题标题】:Audio Player play in background and should work based off of hardware mute switch音频播放器在后台播放,应该基于硬件静音开关工作
【发布时间】:2015-10-14 18:40:16
【问题描述】:

我想在前台、后台播放音频文件,它应该与静音开关一起使用,即如果静音开关打开,那么它不应该播放,如果静音开关关闭应该播放音频。

**我正在开发一个 SIP 呼叫应用程序。当用户接听电话时,应用程序应播放声音/铃声。如果应用程序在后台/前台,它应该播放,如果硬件静音开关打开/关闭,它应该静音/取消静音。

为此,我使用了带有以下代码的 AVPlyaer。

AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback error:&error];
[session setActive:YES error:nil];

NSURL * audioFileUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test1" ofType:@"mp3"]];
AVPlayer *player = [[AVPlayer alloc] initWithURL: audioFileUrl];
[player play];

我还在 info.plist 的背景模式中添加了“应用程序使用 AirPlay 播放音频或流式传输音频/视频”

这在两种模式下都在播放,但在硬件静音开关打开时不会静音。 如果我使用AVAudioSessionCategoryAmbient 不在后台模式下播放。 我使用了 AVAudioPlayer,但在硬件开关打开时无法找到静音

【问题讨论】:

标签: ios audio audio-player avaudiosession mute


【解决方案1】:

很高兴地说,我发现 Skype 是如何实现此功能的。

在前台我们可以使用任何一个类别的 AVAudioSession 来播放铃声。

AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory: AVAudioSessionCategorySoloAmbient error:&error];
[session setActive:YES error:nil];

NSURL * audioFileUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test1" ofType:@"mp3"]];
AVPlayer *player = [[AVPlayer alloc] initWithURL: audioFileUrl];
[player play];

在后台,我们必须使用带有自定义声音的本地通知。这将与硬件静音开关一起使用。但是这里的声音文件长度不能超过30秒。

    UILocalNotification* notification = [[UILocalNotification alloc] init];
    [notification @"Title"];
    [notification setAlertBody:@"Body"];
    [notification setAlertAction:noteAction];
    [notification setSoundName:@"ringtone.mp3"];
    [[UIApplication sharedApplication] presentLocalNotificationNow:notification];

希望这会有用:)。

【讨论】:

  • 你能为这段代码提供更多的上下文吗?我不确定您在哪里实现它/它如何为您提供有关静音开关的信息。
  • 它不会提供任何信息,通知声音会根据静音开关工作,AVAudioSession 不会根据静音开关工作。
  • @Ganee ....,但是你如何处理,如果假设 VoIP 呼叫进入后台状态并且用户点击它,在前台出现后,你如何管理播放铃声?
  • 在后台模式下,当您点击通知时,通知声音将停止并打开应用程序。应用程序打开后(意味着处于前台模式),如果呼叫仍处于振铃模式,您可以使用 AVPlayer 播放音频。
  • @Ganee.... 这看起来是正确的解决方案,非常感谢!我仍然无法理解为什么 Apple 没有提供正确的类别来遵守前台和后台的静音切换。
【解决方案2】:

这是一个用于检测静音开关状态的库:http://sharkfood.com/content/Developers/content/Sound%20Switch/。 它基于 Apple 的公共 API。它只是播放系统声音并测量完成播放所用的时间。它在 Instagram iOS 应用中使用。

【讨论】:

  • 这适用于 ios9,不使用后台使用
  • @Miro 无法为我工作。你有机会分享你的代码吗?
  • 他们的网站给了我代码,但是在你将他们的 .h/.m 文件复制到你的项目中之后,它几乎是:_detector = [SharkfoodMuteSwitchDetector shared]; _detector.silentNotify = ^(BOOL silent){ /* 在这里做点什么 */ }
【解决方案3】:

您的音频会话类别可能设置不正确。 既然要尊重静音开关,就应该使用 SoloAmbient

AVAudioSessionCategorySoloAmbient

默认类别的类别, 除非您使用 setCategory:error: 或 setCategory:withOptions:error: 方法。

您的音频会因屏幕锁定和静音开关(在 iPhone 上称为响铃/静音开关)而静音。

默认情况下,使用此类别意味着您的应用的音频是 不可混合——激活您的会话将中断任何其他音频 会话也是不可混合的。要允许混合,请使用 AVAudioSessionCategoryAmbient 类别代替。

适用于 iOS 3.0 及更高版本。

您似乎使用过这个类别:

AVAudioSessionCategoryPlayback

播放录制的音乐或其他中心声音的类别 成功使用您的应用程序。

使用此类别时,您的应用音频会在静音开关设置为静音或屏幕锁定时继续播放。(该开关称为 iPhone 上的响铃/静音开关。) 应用程序过渡到背景(例如,当屏幕 锁),将音频值添加到您的 UIBackgroundModes 键 信息属性列表文件。

默认情况下,使用此类别意味着您的应用的音频是 不可混合——激活您的会话将中断任何其他音频 会话也是不可混合的。为了允许混合这个类别, 使用 AVAudioSessionCategoryOptionMixWithOthers 选项。

适用于 iOS 3.0 及更高版本。

来源: https://developer.apple.com/library/prerelease/ios/documentation/AVFoundation/Reference/AVAudioSession_ClassReference/index.html#//apple_ref/doc/constant_group/Audio_Session_Categories

【讨论】:

  • "AVAudioSessionCategoryAmbient" 这不在后台播放,"AVAudioSessionCategoryPlayback" 这不适用于静音开关。你能告诉我这两种情况下的一个工作吗?或者任何其他方式来实现它。
  • @Ganee....好吧抱歉我误解了。您想在屏幕关闭时播放音频,而不是在静音时播放。它是否正确?那么我遇到了和你一样的障碍。苹果似乎没有为此提供音频类别。对不起,我没有帮助。 :(
  • 但是,Skype 是如何实现这个功能的 :(,有什么建议吗?
  • @Ganee.... 抱歉,我不是 iOS 开发人员。我什至没有 iOS 设备。我希望有人能够帮助你。
  • 这个答案解决了我的问题。我在应用商店收到了负面评论,因为用户将手机设为静音,并认为该应用已损坏。我想我必须将我的音频会话设置为 AVAudioSessionCategorySoloAmbient,这样你就可以在其他应用程序/iTunes 上播放它的音频。但是,使用 AVAudioSessionCategoryPlayback 并将其选项设置为 AVAudioSessionCategoryOptionMixWithOthers 现在允许我的应用程序在静音模式下播放声音并且不会中断其他音频源。谢谢!
猜你喜欢
  • 2013-09-22
  • 2022-07-19
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 2015-05-27
  • 1970-01-01
相关资源
最近更新 更多