我在一个视图中有6个声音。
但是我想要它,以便我可以一次播放多个,所以你点击声音1(声音1正在播放)然后声音2播放。声音1仍然在播放。
但是此刻我按声音1(声音1次播放),按声音2(声音2播放,但声音1停止)
以下是音频部分的代码。
- (IBAction)oneSound:(id)sender; {
NSString *path = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"wav"];
if (theAudio) [theAudio release];
theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
theAudio.delegate = self;
[theAudio play];
volumeTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(updateVolume) userInfo:nil repeats:YES];
}
- (IBAction)twoSound:(id)sender; {
NSString *path = [[NSBundle mainBundle] pathForResource:@"2" ofType:@"wav"];
if (theAudio) [theAudio release];
theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
theAudio.delegate = self;
[theAudio play];
volumeTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(updateVolume) userInfo:nil repeats:YES];
}
答案 0 :(得分:4)
缺少一些重要的代码,但看起来好像theAudio
是用于管理声音播放的全局代码。由于您在播放声音时将其销毁,因此当前播放的任何内容都将停止以准备下一个声音。
有几种方法可以解决这个问题,其中一种方法是每个声音都有自己独特的AVAudioPlayer
实例。
答案 1 :(得分:2)
不要因为它存在而释放播放器。完成播放后发布
您应该在app delegate或app delegate的属性中实现此功能,以便在弹出视图时委托引用仍然有效。
你不应该为每个声音都这样做。每个语音都会使用不同的文件名或URL初始化播放器。你可以通过确保在完成比赛后释放来获得这一点。另一件需要注意的事情是,如果球员由于中断而未能完成比赛,则会释放球员。
#pragma mark -
#pragma mark Audio methods
-(void)playNote:(NSInteger)noteNumber {
NSString *soundFilePath =
[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%i", noteNumber ]
ofType: @"caf"];
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];
AVAudioPlayer *playerToPrepare = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL
error:nil];
[fileURL release];
[playerToPrepare prepareToPlay];
[playerToPrepare setDelegate: self];
[playerToPrepare play];
}
#pragma mark -
#pragma mark AVAudioPlayer delegate methods
- (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) playerThatFinished
successfully: (BOOL) completed {
if (completed) {
[playerThatFinished release];
}
}
答案 2 :(得分:1)
您可以声明并使用:
AVAudioPlayer *theAudio1; // for file 1.wav
AVAudioPlayer *theAudio2; // for file 2.wav
...
AVAudioPlayer *theAudio6; // etc.
而不是只释放和重用一个AVAudioPlayer。