objective-c – 当AudioSessionActive为NO时,无法通过硬件按钮控制AVAudioPlayer的音量

objective-c – 当AudioSessionActive为NO时,无法通过硬件按钮控制AVAudioPlayer的音量,第1张

概述我正在构建一个转弯导航应用程序,播放周期性的短片声音.无论屏幕是否被锁定,声音都应该播放,应该与其他音乐播放混合,并且当播放此音频时应该播放其他音乐. Apple在29:20分钟的“WWDC 2010会话412 iPhone OS第1部分音频开发”视频中详细讨论了转弯用例.实施效果很好,但有一个问题 – 当应用程序运行时,按下硬件音量控件可调整铃声音量,而不是应用音量.如果要更改应用程序音量,则必 我正在构建一个转弯导航应用程序,播放周期性的短片声音.无论屏幕是否被锁定,声音都应该播放,应该与其他音乐播放混合,并且当播放此音频时应该播放其他音乐.

Apple在29:20分钟的“WWDC 2010会话412 iPhone OS第1部分音频开发”视频中详细讨论了转弯用例.实施效果很好,但有一个问题 – 当应用程序运行时,按下硬件音量控件可调整铃声音量,而不是应用音量.如果要更改应用程序音量,则必须在播放提示时按音量按钮.

Apple在视频中非常具体,您不应该让AVAudioSession处于活动状态,但如果AVAudioSession处于非活动状态,则音量按钮将无法控制我的应用程序的音量.

这是我用来设置的代码:

UInt32 sessioncategory = kAudioSessioncategory_mediaplayback;propertySetError = AudioSessionSetProperty(kAudioSessionProperty_Audiocategory,sizeof(sessioncategory),&sessioncategory);UInt32 allowMixing = true;propertySetError = AudioSessionSetProperty(kAudioSessionProperty_OverrIDecategoryMixWithOthers,sizeof(allowMixing),&allowMixing);UInt32 shouldDuck = true;propertySetError = AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck,sizeof(shouldDuck),&shouldDuck);Osstatus activationResult = AudioSessionSetActive(true);NSError* err = nil;_player = [[AVAudioPlayer alloc] initWithData:audioData error:&err];_player.delegate = self;[_player play];

并且我在最后将会话激活为NO,因为Apple建议:

Osstatus activationResult = AudioSessionSetActive(false);NSAssert(activationResult == kAudioSessionNoError,@"Error deactivating audio session");

有什么我想念的,或者我不得不违背他们在视频中推荐的内容?

解决方法 在您的情况下,您不希望将音频会话设置为非活动状态.您需要做的是使用两种方法,一种是设置会话以播放声音,另一种是将其设置为空闲.第一种方法设置混合鸭音频模式,第二种方法使用背景音频友好模式,如环境.

像这样的东西:

- (voID)setActive {    UInt32 mix  = 1;    UInt32 duck = 1;    NSError* errRet;    AVAudioSession* session = [AVAudioSession sharedInstance];    [session setActive:NO error:&errRet];    [session setcategory:AVAudioSessioncategoryPlayback error:&errRet];    NSAssert(errRet == nil,@"setcategory!");    AudioSessionSetProperty(kAudioSessionProperty_OverrIDecategoryMixWithOthers,sizeof(mix),&mix);    AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck,sizeof(duck),&duck);    [session setActive:YES error:&errRet];}- (voID)setIDle {    NSError* errRet;    AVAudioSession* session = [AVAudioSession sharedInstance];    [session setActive:NO error:&errRet];    [session setcategory:AVAudioSessioncategoryAmbIEnt error:&errRet];    NSAssert(errRet == nil,@"setcategory!");    [session setActive:YES error:&errRet];}

然后叫它:

[self setActive];[self _playAudio:nil];

播放后清理:

- (voID)audioPlayerDIDFinishPlaying:(AVAudioPlayer*)player                   successfully:(BOol)flag {[self setIDle];

}

要成为一个好公民,你的应用程序应该在音频会话不导航时(即执行其主要功能)将其设置为非活动状态,但是当它存在时,保持音频会话处于活动状态并使用模式完全没有错和平共处其他应用程序.您可以使用上面的代码复制Apple的导航应用功能.

总结

以上是内存溢出为你收集整理的objective-c – 当AudioSessionActive为NO时,无法通过硬件按钮控制AVAudioPlayer的音量全部内容,希望文章能够帮你解决objective-c – 当AudioSessionActive为NO时,无法通过硬件按钮控制AVAudioPlayer的音量所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1215046.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存