2010-07-27 56 views
1

这使我疯了,我有一个iPhone应用程序,播放从iPod应用程序播放的背景音乐,当我播放声音时,我想要播放背景音乐直到声音播放完毕。所以,我把我的音频会议没有改变,直到我需要播放声音,当我打我设置kAudioSessionProperty_OtherMixableAudioShouldDuck属性的声音,然后激活会话。当声音停止时,停用会话以允许背景音乐恢复到正常音量。这鸭子的声音,但似乎停止播放背景音乐。无法使用kAudioSessionProperty_OtherMixableAudioShouldDuck

看来,如果我设置kAudioSessionProperty_OtherMixableAudioShouldDuck,那么kAudioSessionProperty_OverrideCategoryMixWithOthers标志将在系统中某处清除,反之亦然。它看起来像你需要这两个设置以获得所需的行为,但无论我上次设置覆盖其他和将其关闭。

任何人都不会有什么这里发生的任何想法,任何建议将不胜感激?

+0

可能看这里:http://stackoverflow.com/questions/2579152/using-kaudiosessionproperty-othermixableaudioshouldduck-on-iphone – iwasrobbed 2010-07-27 21:35:36

回答

0

你倒着做你激活。您的应用程序启动后应该有适当策略的音频会话。因此,在这种情况下,从策略为Ambient的音频会话开始。这意味着只要您的音频会话激活,iPod应用程序的背景音乐就会继续播放,这就是您想要的。因此,在您的应用程序启动时(以及任何其他时间到达前端)激活音频会话。

现在,当你想发挥自己的声音,申请回避;背景音乐将立即起作用。

然后,当你完成你的声音,去除闪避。以下是棘手的部分:如果您希望删除避让以立即应用,则必须停用音频会话。当然,你可以,然后立即将其激活:

UInt32 duck = 0; 
AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck, 
         sizeof(duck), &duck); 
AudioSessionSetActive(false); 
AudioSessionSetActive(true); 
1

你想要做的是设置回避属性,然后激活您的音频会话时播放音频之前那么停用音频会议音频结束后“取消“其他混音音频。无需继续转换避税属性。这是我找到的good blog post on the subject

1

对于很多应用程序@GregC的建议,在开始时设置ducking,然后在播放音频之前激活音频会话并在工作正常后停用。

但是,如果您希望应用程序在不再处于前景时继续提供音频反馈,则这不起作用,因为在进入后台以使操作系统识别出您需要之前需要进行活动音频会话继续播放音频。

所以在那些你需要设置播放(如Playing music when application is in background with kAudioSessionCategory_SoloAmbientSound讨论的环境是不是在后台支持)的acive音频会议,并能够与其他来源的混合情况:你玩之前

AudioSessionInitialize (NULL,NULL,NULL,NULL); 
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; 
AudioSessionSetProperty (kAudioSessionProperty_AudioCategory,sizeof (sessionCategory),&sessionCategory); 
UInt32 doSetProperty = 1; 
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers,sizeof (doSetProperty),&doSetProperty);  
AudioSessionSetActive(true); 

然后音频您需要激活回避:

AudioSessionSetActive(false);  
UInt32 duck = true; 
AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck, sizeof(duck), &duck); 
AudioSessionSetActive(true); 

和播放音频后,你需要重新设置混合其它来源的标志:

AudioSessionSetActive(false); 
UInt32 doSetProperty = 1; 
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers,sizeof (doSetProperty),&doSetProperty);  
AudioSessionSetActive(true); 

我发现的是,如果您尝试在播放音频时将ducking标志设置为false,则会停止并正在播放音频 - 但将MixWithOthers标志设置为反而似乎不会停止播放。

+0

非常感谢你!这正是我正在寻找的东西:)作品像一个魅力! – Hannes 2013-04-22 15:22:40