2015-10-28 185 views
1

我有一个可以显示视频的应用程序,我想要以下行为。AVAudioSession在混合模式和非混合模式之间切换

  • 当一个视频第一次出现在屏幕上并开始播放时,它的音频应该与来自其他正在播放的应用程序的音频混合。例如,如果用户正在收听Spotify,他们应该会听到来自Spotify和播放视频的音频。

  • 如果用户点击某个特定的按钮,应该将来自其他应用的音频静音,以便只播放来自视频的音频。

  • 如果用户再次点击该按钮,则应恢复来自其他应用的音频,并且该视频的音频以及来自其他应用的音频应再次混合。

本质上,我希望能够在“混合”和“非混合”之间切换我的应用程序的音频模式。

下面是一些代码,显示我如何修改AVAudioSession以尝试获得此功能。

在混合模式

AVAudioSession *session = [AVAudioSession sharedInstance]; 
[session setCategory:AVAudioSessionCategoryAmbient 
     withOptions:AVAudioSessionCategoryOptionMixWithOthers 
       error:nil]; 
[session setActive:YES withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil]; 

关闭混合模式

AVAudioSession *session = [AVAudioSession sharedInstance]; 
[session setCategory:AVAudioSessionCategoryPlayback 
     withOptions:0 
       error:nil]; 
[session setActive:YES withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil]; 

说我遇到的问题是打开以前关闭它后,打开音频混合,没有按不通知其他应用程序他们可以重新播放音频。我真的很想要那种行为。那是不可能的。

似乎要通知其他应用程序他们可以恢复的唯一方法是将我的应用程序的音频会话设置为“不活动”。不幸的是,在播放视频时进行此操作会导致在控制台中打印出一条警告,声明应在停用音频会话之前停止播放音频。这也有基本上打破了AVPlayer,因为它不能再播放任何音频。

任何人都知道如何解决这些问题?任何解决方案都会受到欢迎,即使是非常复杂的或者使用私有API的解决方案。

回答

0

也许您应该在“关闭混音模式”块中将“是”更改为“否”。

[session setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil]; 
+0

问题是,在播放视频时,我无法将音频会话设置为非活动状态。 AVPlayer对此并不酷,而且之后不会播放声音。您需要暂停并再次播放视频才能从中恢复。 – Antonio

1

我觉得你运气不好。即使AVAudioSessionCategoryOptionDuckOthers听起来像它应该适合您的用例,要求您停用会话以将其他应用的音量恢复到正常,但正如您所看到的,这会导致错误。

+0

雅,我很担心是这样。怎么样欺骗iOS发送“从中断恢复”通知到其他进程? – Antonio

+0

您是否认为扩展可以获得自己的音频会话? –