向UIButton添加声音的可靠方法

时间:2013-01-04 23:12:47

标签: iphone ios audio avaudioplayer system-sounds

我正在尝试向UIButton添加一个点击声音,以便在按下时播放。到目前为止,我已经尝试了两种方法,但没有一种方法能达到我想要的效果。

  1. 我尝试使用简单的SystemSounds,但它们是一个丑陋的解决方案,因为用户对音频音量没有(或非常有限)的控制。

  2. 我还尝试了以下形式的AVAudioPlayer(在ViewController的init方法中调用):

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient 
                                           error:nil];
    [[AVAudioSession sharedInstance] setActive:YES error:nil];
    [[AVAudioSession sharedInstance] setDelegate:self];
    
    NSString *filePath = [[NSBundle mainBundle] 
                         pathForResource: @"button_pushed"
                                  ofType: @"wav"];
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: filePath];
    self.buttonPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL
                                                               error: nil];
    [buttonPlayer prepareToPlay];
    [buttonPlayer setDelegate: self];
    
  3. 第二种方法似乎比第一种方法好很多;特别是当我使用以下声明调用声音时:

        if (self.clickPlayer.playing) {
            [self.clickPlayer stop];
            self.clickPlayer.currentTime = 0;
            [self.clickPlayer play];
        }
        else {
            [self.clickPlayer play];
        }
    

    上面确保我反复按下按钮时响应非常快。顺便提一下,快速响应时间在我的应用程序中是必不可少的,不幸的是,这是第二种方法失败的地方。

    如果我让应用程序闲置大约10秒钟,加载第一个声音需要一个明显的延迟(然后,它变得快速并且再次响应)。不仅如此,它还延迟了按钮被推动。虽然这种延迟非常小(可能是一秒钟的一小部分),但不幸的是它确实影响了我的应用程序的可用性。就好像声音自动被解除分配,每次我暂时不使用声音时需要初始化或放入内存。

    是否有一种解决方法可以始终保持声音可用并避免延迟或其他可能简单的方法来实现按钮声音?

    更多信息: 我使用ARC 我不使用IB 3.目前,没有实施音频委托方法 从其他应用程序在后台播放音频的能力非常重要 5.延迟发生在iPhone 5上;所以,我只能想象在功能较弱的设备上需要多长时间......

2 个答案:

答案 0 :(得分:1)

我设法通过创建一个“空白”播放器来解决这个问题,该播放器不断发出没有声音的微小.wav文件,因此保持AVPlayer活着。这可能不是最优雅的解决方案,但它确实有效,但它似乎不会影响程序的性能。这是你需要做的:

  1. 创建一个0.1秒长的静默.wav文件(越小越好)。

  2. 为其初始化播放器:

    NSString *filePath = [[NSBundle mainBundle] pathForResource: @"silence"
                                                         ofType: @"wav"];
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: filePath];
    silencePlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL
                                                           error: nil];
    [silencePlayer prepareToPlay];
    [silencePlayer setDelegate: self];
    
  3. 然后每隔一秒左右开火:

    timer = [NSTimer scheduledTimerWithTimeInterval:1.0f
                                             target:self
                                           selector:@selector(repeatSilence)
                                           userInfo:nil
                                            repeats:YES];
    
  4. 最后,创建被调用的方法( - (void)repeatSilence {})来播放声音:

    if (self.silencePlayer.playing) {
        [self.silencePlayer stop];
        self.silencePlayer.currentTime = 0;
        [self.silencePlayer play];
    }
    else {
        [self.silencePlayer play];
    }
    

答案 1 :(得分:0)

不完全确定,但如果您制作路径的NSData并将[[AVAudioPlayer alloc] initWithContentsOfURL更改为[[AVAudioPlayer alloc] initWithData,它会不会更快?