在几秒钟内(iPhone)播放每次倒计时的点击/刻录声音?

时间:2012-09-08 18:20:24

标签: ios xcode avfoundation avaudioplayer

我已经实现了一个向下计数器,它每秒都会播放Click声音,直到它的计时器失效。同时,我显示计数器值。

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

            }

        }

计数器工作正常,但初始延迟很小;但它没有播放声音,任何人都可以帮助我有效地实现这个概念,并尽量减少延迟......

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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,将循环一次,导致声音连续播放两次。

答案 2 :(得分: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];
}

请记住初始化阵列。