-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
[self NextHeading]; // this plays an mp3 file
[self NextHeadingMeaning]; // this plays an Mp3 file
}
每次仅调用[self NextHeadingMeaning]
方法NextHeading
并且都错过
-(IBAction) NextHeading{
[audio stop];
NSString *Filename = [[NSString alloc]initWithFormat:@"CH%@S%@",Heading,Meaning];
Filepath = [[NSBundle mainBundle]pathForResource:Filename ofType:@"mp3"];
audio = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:Filepath] error:NULL];
audio.delegate = self;
[audio play];
[Filename autorelease];
}
-(IBAction) NextHeadingMeaning {
[audio stop];
NSString *Filename = [[NSString alloc] initWithFormat:@"CH%@S%@",bold**Chapter**bold, Meaning];
Filepath = [[NSBundle mainBundle]pathForResource:Filename ofType:@"mp3"];
audio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:Filepath] error:NULL];
audio.delegate = self;
[audio play];
[Filename autorelease];
}
为什么会发生这种情况,我该如何解决?
请指教,提前谢谢。
你只是使用了一个iVar(audio
)作为播放器,当你发送NextHeading
和NextHeadingMeaning
消息时,audio
首先与你的sound_1.mp3
文件一起初始化(如果mp3文件很大,则需要几秒钟),然后在下一刻(你的第一个mp3文件可能没有启动,或者已经启动, 但停止了,然后是下一条消息),您使用另一个 mp3 文件 (sound_2.mp3) 重做初始化操作,最后,当第二个 mp3 文件初始化完成时,audio
播放sound_2.mp3
.这就是为什么你认为跳过NextHeading
。
因此,要解决此问题,您可以使用NSMutableArray
iVar(例如 audioPlayers
),并为NextHeading
和NextHeadingMeaning
创建一个本地audio
,并将其推送到audioPlayers
。
我认为如果可以的话,最好预加载声音文件。 :)
编辑:
有一个playAtTime:
方法代替play
,你可以通过这种方法延迟第二个音频播放器的播放时间,就像这样:
[audioPlayer playAtTime:(audioPlayer.deviceCurrentTime + delay)];
delay
以秒为单位(NSTimeInterval
)。
跳过第一次调用,在其中放置断点或使用 NSLog() 输出一些东西,你会看到。最可能的原因是第一种方法没有达到您的预期,这可能是由于各种原因 - 例如条件或特定超时。
编辑:查看代码后,似乎缺少一些基本内容,例如变量命名,变量范围等。若要简单地运行代码,只需替换第二种方法中的NSString *Filename..
字符串,它可能会起作用。更好的选择是访问立即开始开发iOS应用程序并遵循路线图。