昨天晚上尝试了一下AVAudioPlayer ,正当尝试播放一个歌曲的时候,突然就不播放了。很奇怪的事情发生了,查看了资料,修改了一行代码就好。
原来AVAudioPlayer 被莫名地回收了,是弱引用的缘故吗? 没有报错,很正常 就是歌曲播放不出来。尝试了把AVAudioPlayer 的对象声明strong 后,很顺利播放出来。
AVAudioPlayer播放本地的歌曲还是可以,尝试了网络却不行。不知道为什么,也尝试把其加载到本地用NSData去解决,现在还没实验完成。但是我估计是可行的。
AVAudioPlayer 本身init类型方法有接受NSData参数 也有NSURL参数的。播放期间,遇到卡主的情况,其他代码都执行不到。不知道不是线程问题。加了一个异步执行的线程后,又没事了。
可以说,AVAudioPlayer 这个坑也真不少。一个是对象强弱性引起自动回收,然后歌曲就不能播放。一个是播放歌曲的时候,会卡主 导致其他代码都执行不到没任何反应。我猜想是阻塞了。
NSError *err =nil;
NSString *path= [[NSBundle mainBundle] pathForResource:@"2" ofType:@"mp3"];
NSURL *fileURL = [NSURL fileURLWithPath:path];
NSData *data = [[NSData alloc]initWithContentsOfURL:fileURL];
//AVAudioPlayer *player =[[AVAudioPlayer alloc]initWithContentsOfURL:fileURL error:&err];
AVAudioPlayer *player =[[AVAudioPlayer alloc]initWithData:data error:&err];
self.audipPlayer = player;
player.volume =1;
[player prepareToPlay];
BOOL isucess = [player play];
if (!isucess)
{
NSLog(@"%@",err);
}
else
{
NSLog(@"播放中");
}
AVAudioPlayer *player =[[AVAudioPlayer alloc]initWithContentsOfURL:fileURL error:&err];
这里可以用NSURL做参数。
开始 [player prepareToPlay]; 我很奇怪为什么要这行代码?我尝试去掉后 其实还是可以播放歌曲。
self.audipPlayer = player;//自定义了一个AVAudioPlayer对象,赋值给它。歌曲就可以播放了。或者直接创建的时候这样处理
self.audipPlayer =[[AVAudioPlayer alloc]initWithData:data error:&err];
而不是
AVAudioPlayer *player =[[AVAudioPlayer alloc]initWithData:data error:&err]; 直接这样子就没下文了。