-(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
),并创建本地 audio
对于两者NextHeading
& NextHeadingMeaning
,并将其推送至 audioPlayers
.
而且我认为如果可以的话最好预加载声音文件。 :)
编辑:
有一个playAtTime:
方法而不是 play
,你可以通过这个方法延迟第二个音频播放器的播放时间,就像这样:
[audioPlayer playAtTime:(audioPlayer.deviceCurrentTime + delay)];
delay
以秒为单位 ( NSTimeInterval
)。
关于objective-c - xcode Objective c - 当我调用 2 个方法时 - 仅运行最后一个调用的方法,并跳过第一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10266900/