2
-(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]; 
}

为什么会发生这种情况,我该如何解决?

请指教,先谢谢了。

4

2 回答 2

2

没有办法跳过第一个调用,在其中放置一个断点或使用 NSLog() 输出一些东西,你会看到。最可能的原因是第一种方法没有达到您的预期,这可能是由于各种原因 - 例如条件或特定超时。

编辑:查看您的代码后,您似乎缺少一些基本的东西,如变量命名、变量范围等。要简单地使您的代码运行,只需替换NSString *Filename..第二种方法中的字符串,它可能会起作用。更好的选择是访问立即开始开发 iOS 应用程序并遵循路线图。

于 2012-04-22T09:57:38.817 回答
2

您只是使用单个 iVar ( audio) 作为播放器,当您发送NextHeading&NextHeadingMeaning消息时,首先audio使用您的文件初始化sound_1.mp3(如果 mp3 文件很大,则需要几秒钟),然后在下一刻(您的第一个 mp3 文件可能未初始化,或已初始化,但在下一条消息后停止),您使用另一个 mp3 文件(sound_2.mp3)重做初始化操作,最后,当第二个 mp3 文件初始化完成时,audio播放sound_2.mp3. 这就是您认为NextHeading跳过的原因。

因此,要解决这个问题,您可以使用NSMutableArrayiVar(例如),并为两者audioPlayers创建一个本地& ,并将其推送到.audioNextHeadingNextHeadingMeaningaudioPlayers

而且我认为如果可以的话,最好预加载声音文件。:)


编辑:

有一个playAtTime:方法代替play,你可以通过这个方法来延迟第二个音频播放器的播放时间,就像这样:

[audioPlayer playAtTime:(audioPlayer.deviceCurrentTime + delay)];

delay以秒为单位 ( NSTimeInterval)。

于 2012-04-22T11:11:53.707 回答