AVAudioPlayer不能播放任何声音

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

  • 工作区
    • 应用程序本身(主要项目)
    • 一个实用程序库

在构build实用程序库之后,会产生一个静态库,在主应用程序中用作框架。

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

 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有关吗?

提前致谢。

我find了解决scheme,它与我没有提及但没有考虑的事情有关:我正在用自动引用计数(ARC)进行编译。

ARC向audio播放器插入释放呼叫,因此在离开创build方法后立即解除分配。 它与AVAudioPlayer无关,但与ARC。

为了解决这个问题,我只是为处理声音的类创build了一个AVAudioPlayer属性,以便它不再被ARC发布。 那么,至less,这个类不会被释放,直到这个类的实例被释放。

有关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]; 

你configuration了AVAudioSession吗?

我有一个类似的问题,并使用这样的东西解决它:

 AVAudioSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:NULL]; 

要么

 [audioSession setCategory:AVAudioSessionCategoryPlayback error:NULL]; 

希望能帮助到你。

即使在类范围中声明了audioPlayer var,它也不会播放。 至less在iOS 10 iPhone 5c物理设备上。

play()结果是true所以不会出现错误。

不得不添加这个( Swift 3,4 ),现在它正确地播放声音。

 let session = AVAudioSession.sharedInstance() try! session.setCategory(AVAudioSessionCategoryPlayback) 

我已经创build了简单的audio播放器的开源项目。 如果您在iOS中播放audio时遇到任何问题(在后台也可以看一下): https : //github.com/wzbozon/DKAudioPlayer

Swift解决scheme:

  import AVFoundation // define your player in class var player = AVAudioPlayer() override func viewDidLoad() { super.viewDidLoad() } 

我遇到过同样的问题。 我通过在.h文件中添加下面一行来解决它:

 @property (strong, nonatomic) AVAudioPlayer *audioPlayer; 

在.m文件中:

 NSError *error; NSString *soundFilePath = [NSString stringWithFormat:@"%@/dancepechance.mp3", [[NSBundle mainBundle] resourcePath]]; NSURL *url = [NSURL fileURLWithPath:soundFilePath]; self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; NSLog(@"Error %@",error); [self.audioPlayer prepareToPlay]; [self.audioPlayer play]; 

请留在页面上一段时间,我面临同样的问题。 并使用睡眠来解决它。


 NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"sounds-1027-are-you-kidding" ofType:@"mp3"]]; AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [audioPlayer play]; sleep(2);