【问题标题】:Play Click/Tick sound on every count down in seconds(iPhone)?以秒为单位在每个倒计时播放时钟/滴答声(iPhone)?
【发布时间】:2012-09-08 18:20:23
【问题描述】:

我已经实现了一个递减计数器,它每秒播放一次点击声音,直到它的计时器失效。同时,我正在显示计数器值。

  -(IBAction)start{
    myTicker =[NSTimerscheduledTimerWithTimeInterval:1.0 target:self selector:@selector(showactivity) userInfo:nil repeats:YES];
        }

        -(void)showactivity;{

        int CurrentTime =[time.textintValue];

        NSString *soundFilePath=[[NSBundlemainBundle] pathForResource:@"Click03" ofType:@"wav"];
        NSURL *soundFileURL =[NSURLfileURLWithPath:soundFilePath];
        AVAudioPlayer *player=[[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
        player.numberOfLoops =1;
        [player play];

        int newTime = CurrentTime-1;
        time.text = [NSString stringWithFormat:@"%d",newTime];
        if(newTime ==0){
                [myTicker invalidate];
        time.text = @"0";

            }

        }

计数器运行良好,但初始延迟很小;但它不播放声音,谁能帮我有效地实现这个概念,以最小的延迟等......

【问题讨论】:

  • 如果你使用ARC,本地AVAudioPlayer对象将在块完成后自动释放。因为没有其他强指针可以让它保持活力,所以没有机会听到/播放你的声音......解决方案是在你的类中使用全局实例而不是本地 AVAudioPlayer 实例。
  • @holex - 是的,它适用于全局,然后我需要在 ViewDidLoad 中加载声音文件并在 -(void)showactivity{} 中使用它,这是一种更好的编程技术吗?我认为编程不仅仅是按预期完成工作,而是以最聪明的方式! :)
  • 如果你一直使用相同的音效,只加载一次会更容易,即在-viewDidLoad方法中。这样可以节省一些资源。

标签: ios xcode avfoundation avaudioplayer


【解决方案1】:

您可以只发出一秒长的声音,包括点击和 1 秒(减去点击的持续时间)的静音样本。将player.numberOfLoops 设置为您必须倒计时的秒数,然后播放一次。

【讨论】:

    【解决方案2】:

    使用 AVAudioPlayer 播放声音

    1) 添加

    @property (nonatomic, strong) AVAudioPlayer *player;
    

    到你的头文件

    记得在你的 .m 文件中合成它

    2) 使用以下代码初始化播放器并播放声音:

            NSString *soundFilePath=[[NSBundle mainBundle]pathForResource:@"yourSoundFile" ofType:@"caf"];
    
        NSURL *soundFileURL =[NSURL fileURLWithPath:soundFilePath];
    
        NSError *err = nil;
    
        self.player=[[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:&err];
    
        self.player.numberOfLoops = 0;
    
        if ([self.player play]) {
            NSLog(@"playing sound");
        }else {
            NSLog(@"COULD NOT play sound");
        };
    

    请注意,将 self.player.numberOfLoops 设置为 0 将播放一次声音。将其设置为 1,将循环播放一次,导致声音连续播放两次。

    【讨论】:

      【解决方案3】:

      解决 ARC 解除分配问题,您可以做的一件事是将所有玩家添加到一个数组中。然后将自己设置为播放器的代理,监听音频何时播放完毕,然后将其从数组中删除。这样,播放器在完成播放之前不会被释放。像这样的:

      @property (nonatomic, strong) NSMutableArray *playersArray
      
      -(void)showactivity
      {
          int CurrentTime =[time.textintValue];
      
          NSString *soundFilePath=[[NSBundlemainBundle] pathForResource:@"Click03" ofType:@"wav"];
          NSURL *soundFileURL =[NSURLfileURLWithPath:soundFilePath];
          AVAudioPlayer *player=[[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
          player.numberOfLoops =1;
          player.delegate = self;
          [player play];
          [self.playersArray addObject:player];
      
          int newTime = CurrentTime-1;
          time.text = [NSString stringWithFormat:@"%d",newTime];
          if (newTime == 0) {
              [myTicker invalidate];
              time.text = @"0";
          }
      }
      
      - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
      {
          [playersArray removeObject:player];
      }
      

      记得初始化你的数组。

      【讨论】:

        猜你喜欢
        • 2011-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多