目标C - 音频播放器完成播放问题!苹果手机SDK



一个声音结束后,可以播放另一个声音...但是在这个代码中,声音是混合的...我该如何解决它?

-(IBAction) ... {
   for ( ...) {
     if (compare(Output, N1)) {
       songPath = [[NSBundle mainBundle] pathForResource:@"a" ofType:@"wav"];
     }
     if (compare(Output, N2)) {
       songPath = [[NSBundle mainBundle] pathForResource:@"b" ofType:@"wav"];
     }
     audioPlayer=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath: songPath] error:NULL];
                [audioPlayer setDelegate:self];
                [audioPlayer play];
   }
}

-(void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL) flag {
  NSLog(@"Song FINISHED!!!!!!");
  [player release];
}

一旦用户点击按钮,音频播放器就会播放,但似乎如果音频没有完成并且用户再次点击它,则会使用对音频文件的另一个引用创建音频播放器的另一个对象。这使得两个甚至更多音频同时播放。嗯,解决方案很简单。只需检查每次点击按钮时,播放器是否已经在播放,如果是,请停止播放器并释放并使用新的文件 url 引用创建新实例。为此,您应该合成 audioPlayer 并将其用作,

-(IBAction) ... {
   for ( ...) {
   if (compare(Output, N1)) {
     songPath = [[NSBundle mainBundle] pathForResource:@"a" ofType:@"wav"];
   }
   if (compare(Output, N2)) {
     songPath = [[NSBundle mainBundle] pathForResource:@"b" ofType:@"wav"];
   }
   if(self.audioPlayer){
     self.audioPlayer.delegate=nil;
     self.audioPlayer=nil;
    }
   self.audioPlayer=[[AVAudioPlayer alloc] initWithContentsOfURL:
                           [NSURL fileURLWithPath: songPath] error:NULL];
   [self.audioPlayer setDelegate:self];
   [self.audioPlayer play];
  }
 }

-(void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL) flag {
     NSLog(@"Song FINISHED!!!!!!");
     [self.audioPlayer setDelegate:nil];   
     self.audioPlayer=nil; 
  }

你的代码不是很好理解,但我想我明白你的目标是什么。

要实现它,假设您有一个 NSArray *itemsToPlay .在一开始(即当用户点击你的按钮时),它充满了你所有的声音。

用户点击按钮后,将调用IBAction。在那里,您可以从itemsToPlay中选择第一个声音(并将其从此容器中删除)并告诉audioPlayer播放。

玩家玩完后,调用audioPlayerDidFinishPlaying:successfully:。在那里,您再次从itemsToPlay中挑选第一项,并用它重新初始化您的audioPlayer。再次,说audioPlayer玩。

itemsToPlay为空时,此循环将结束。

最新更新