【问题标题】:iOS AVAudioPlayer Volume ControliOS AVAudioPlayer 音量控制
【发布时间】:2013-09-03 16:03:37
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ios avaudioplayer volume volumes


    【解决方案1】:

    您不必播放虚拟声音。使用 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

    【讨论】:

      【解决方案2】:

      嘿,未来的答案搜索者,由于 AudioSessionInitializeAudioSessionSetActive 在 iOS7 中已弃用,处理硬件音频和获取回调的推荐方法是使用 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];
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-26
        • 2013-04-03
        • 1970-01-01
        • 1970-01-01
        • 2011-05-18
        • 2012-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多