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);