0

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

  -(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";

            }

        }

计数器工作完美,但初始延迟很小;但它不播放声音,任何人都可以帮助我有效地实现这个概念,以最小的延迟等......

4

3 回答 3

0

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

于 2012-09-08T20:03:47.890 回答
0

使用 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,将循环一次,导致声音连续播放两次。

于 2012-09-09T18:29:14.507 回答
0

您可以做的一件事,解决 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];
}

记得初始化你的数组。

于 2014-11-19T12:47:46.070 回答