【问题标题】:Strange behaviour with AVAudioPlayer on the iPhoneiPhone 上 AVAudioPlayer 的奇怪行为
【发布时间】:2009-12-19 04:45:10
【问题描述】:

我正在尝试使用 AVAudioPlayer 播放声音。应该很简单,但我看到了一些奇怪的结果。

代码:

NSString *path = [[NSBundle mainBundle] pathForResource:@"pop" ofType:@"wav"];
NSURL *url = [NSURL fileURLWithPath:path];
AVAudioPlayer *sound = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
[sound play];
[sound release];

我看到的是正常使用该应用时没有播放声音。

只有在我使用调试器单步执行代码时播放,在执行任何其他方式时它不会播放...

我没有在我的应用程序中创建任何新线程或运行循环,所以这一切都应该在主线程上运行,至少 [NSThread isMainThread] 返回 true。

有人知道这里发生了什么吗?

【问题讨论】:

    标签: iphone audio avaudioplayer


    【解决方案1】:

    AVAudioPlayer 的play 方法是异步的,所以你开始播放声音然后立即释放它!这就是为什么当你在调试器中单步调试它时它会起作用——你在杀死它之前给它时间玩。您要做的是实现 AVAudioPlayerDelegate 的 -(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 方法,并在播放完声音后释放音频播放器。

    【讨论】:

      【解决方案2】:

      papajohn 是对的,你应该这样做

      有一个类似音频播放器的类级变量

      AVAudioPlayer *classLevelPlayer;
      

      合成这个对象。并在调用播放器方法中

      -(void)playTheSong{
      
      if(classLevelPlayer!=nil){
      [classLevelPlayer stop];
      [self setClassLevelPlayer:nil];
      }
      
      NSString *path = [[NSBundle mainBundle] pathForResource:@"pop" ofType:@"wav"];
      NSURL *url = [NSURL fileURLWithPath:path];
      
      AVAudioPlayer *sound = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
      
      if(sound){
      [self setClassLevelPlayer:sound];
      [classLevelPlayer play];
      }
      [sound release];
      }
      

      -(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
       [self setClassLevelPlayer:nil];
      }
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2012-08-23
        • 2013-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-24
        • 1970-01-01
        相关资源
        最近更新 更多