0

所以我成功地创建了一个应用程序,在这种情况下,它是一个使用 linphone sip 库的 VOIP 应用程序。我正在做一些测试,我希望 WAV 文件始终播放,无论我的应用程序是在前台还是后台。我能够使用以下代码成功实现此测试:

NSString * resourcePath = [NSString stringWithFormat:@"%@/myres/sounds/oldphone-mono.wav",[[NSBundle mainBundle] resourcePath]];



    ringer = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:resourcePath] error:nil];

    [ringer setNumberOfLoops:100];



    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

    [[AVAudioSession sharedInstance] setActive:YES error:nil];



    [ringer setVolume:1.0];



    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;

    AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride);


        [ringer play];

我认为这是非常简单的代码,因为我从另一个堆栈溢出答案中复制了它。我还必须对我的 plist 文件做一些事情以允许音频背景播放。

所以问题是一些第 3 方软件的功能(在本例中为 LinPhone SIP 库的接收来电功能)在触发时会阻止我的应用程序在后台播放我的声音文件。

例如,这是一个测试用例:

  • 启动我的应用程序,我听到铃声 wav 文件,这很好
  • 我将应用程序置于后台模式,我仍然听到振铃的 wav 文件,这很好
  • 我将应用程序重新聚焦,我仍然听到铃声,这很好
  • 我触发了linphone接听电话功能,铃声还在继续,因为我在前台,这很好
  • 我将应用程序置于后台模式,铃声停止,这不好

所以我怀疑 linphone 对 avaudioplayer/avaudiosession 做了一些事情,这样我就不能再在后台播放了。所以我的问题是,任何人都可以猜测 linphone 可能做了什么来阻止我的应用在后台播放声音,以及我如何解决这个问题?

补充说明

我什至尝试在应用程序处于后台时每秒实例化一个新的 avaudioplayer。但它无法覆盖 linphone 为使音频播放静音所做的任何事情。

4

1 回答 1

1

看来 Linphone 弄乱了 AVAudioSession 类别选项。我必须将类别选项重置为 AVAudioSessionCategoryOptionMixWithOthers 才能解决问题,如下所示:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil];
于 2013-08-30T20:44:38.840 回答