AVAudioPlayer不能播放任何声音

我正在研究需要使用AVFoundation框架播放一些声音的iOS应用程序。 Xcode 4中的工作区结构包含两个项目:

  • 工作区
  • 应用程序本身(主要项目)
  • 实用程序库
  • 在构建实用程序库之后,它会生成一个静态库,该库在主应用程序中用作框架。

    所以,当试图通过使用下面的代码在主应用程序内播放声音时,它按预期工作。

    NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
    NSString *path = [NSString stringWithFormat:@"%@/sound.mp3", resourcePath];
    
    NSURL *url = [NSURL fileURLWithPath:path];
    NSError *error = nil;
    
    AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url
                                                                        error:&error];
    [audioPlayer play];
    

    相反,当试图使用与上述相同的代码在实用程序库内播放完全相同的声音(或任何其他声音)时,即使错误为零且audioPlayer属性值为正确声音(数字的频道,持续时间)。

    我已经确定AVFoundation框架在两个项目中。

    另外,我的类使用AVAudioPlayerDelegate协议并实现了这两种方法:

    - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;
    - (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error;
    

    尝试播放声音后,不会调用这些方法。

    如果我使用AudioToolbox框架,那么它会播放声音。 但我有兴趣使用AVFoundation有几个原因。

    对发生了什么的任何想法? 我是否错过了AVFoundation一些内容? 它可能与在静态库中使用AVAudioPlayer有关吗?

    提前致谢。


    我找到了解决方案,它与我没有提及并没有考虑的事情有关:我正在使用自动引用计数(ARC)进行编译。

    ARC向音频播放器插入释放呼叫,因此它在离开创建方法后立即释放。 它与AVAudioPlayer无关,但与ARC无关。

    为了解决这个问题,我刚刚为处理声音的类创建了一个AVAudioPlayer属性,以便它不再由ARC发布。 至少,这个类在发布之前不会被释放。

    有关ARC的更多信息,请参阅自动引用计数:清零弱引用,并详细说明为什么出现此问题。


    是的,一点没错; ARC也是我的代码的原因。

    我介绍了一个属性:

    @property (strong, nonatomic) AVAudioPlayer *audioPlayer;
    

    这使一切工作良好。


    使用它它肯定会工作....

    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setCategory:AVAudioSessionCategoryPlayback error:nil];
    
    NSURL *url = [NSURL fileURLWithPath:@"path of the sound file :)"];
    _player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    [_player setDelegate:self];
    [_player prepareToPlay];
    [_player play];
    
    链接地址: http://www.djcxy.com/p/50999.html

    上一篇: AVAudioPlayer not playing any sound

    下一篇: Xcode 4 build succeeds, command line build fails?