iOS AVAudioPlayer音量控制

时间:2013-08-30 20:39:24

标签: ios avaudioplayer volume volumes

我已经阅读了很多关于这个主题的帖子,但答案并非100%明确。我在这里寻求清晰。

我的应用会定期播放短AVAudioPlayer声音。问题是,我只能在播放第一个声音后设置音量。

在阅读stackoverflow之后,每个人似乎都建议我在应用程序启动时播放一个虚拟(静音)AVAudioPlayer声音,将设备的音量按钮“链接”到“app volume”。

换句话说,当应用程序启动时,它是默认控制的“Ringer”音量,只有在播放第一个声音后,设备的音量按钮才会最终控制“app volume”(AVAudioPlayer音量)(这是图像没有任何标签)。不幸的是,当这种情况发生时,用户听不到第一个声音,现在看到应用程序已损坏。

我的问题是,这是答案吗?我是否只是在应用程序启动时播放一个简短的虚拟声音,以将设备的音量按钮“链接”到应用程序?

Reference Image

2 个答案:

答案 0 :(得分:4)

您不必播放虚拟声音。使用AudioToolbox框架,您可以按如下方式设置AudioSessionActive:

AudioSessionInitialize (NULL, NULL, NULL, NULL);
UInt32 sessionCategory = kAudioSessionCategory_AmbientSound;
AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof (sessionCategory), &sessionCategory);
AudioSessionSetActive (true);

这将允许音量按钮控制应用音量。

有关此方法的详情,请参阅此问题:Cannot Control Volume of AVAudioPlayer via Hardware Buttons when AudioSessionActive is NO

答案 1 :(得分:1)

嘿,对于未来的答案搜索者,由于iOS7中不推荐AudioSessionInitializeAudioSessionSetActive,因此处理硬件音频和获取回叫的推荐方法是使用AVAudioSession对象。在会话的@"outputVolume"属性上将会话设置为活动,并将KVO设置为活动。

- (id)init
{
    self = [super init];
    if (self)
    {

       self.audioSession = [AVAudioSession sharedInstance];
       [_audioSession setActive:YES error:nil];
       [_audioSession addObserver:self forKeyPath:@"outputVolume" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew  context:NULL];
    }
    return self;   
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"outputVolume"])
    {
        [self setVolume:[change[@"new"] floatValue]];
    }
}

- (void)dealloc
{
    [_audioSession removeObserver:self forKeyPath:@"outputVolume"];
    [_audioSession setActive:NO error:nil];
}