我已经实现了一个向下计数器,它每秒都会播放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";
}
}
计数器工作正常,但初始延迟很小;但它没有播放声音,任何人都可以帮助我有效地实现这个概念,并尽量减少延迟......
答案 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];
}
请记住初始化阵列。