如题。。。
网上下了某播放音频的demo工程,真机调试一切正常。
自己照着写了一个,竟然播放不出任何声音,查询所有的代码,找不到不对的地方,一个很诡异的状况是:正常运行播放不了任何声音,单步调试到audio player播放的地方,声音竟然出来了。。。。。。难道是主线程中断了audio player的播放?
AVAudioPlayer * avPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:recordedTmpFile error:&error];
[avPlayer prepareToPlay];
[avPlayer play];
问google大神,发现ios5之后有很多这样的情况。
一个不靠谱的解决方案是:
AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:TmpFile options:nil];
CMTime audioDuration = audioAsset.duration;
float audioDurationSeconds = CMTimeGetSeconds(audioDuration);
在播放的代码之后,将线程强制sleep音乐的时间。。。。。。。
[NSThread sleepForTimeInterval:audioDurationSeconds];
http://stackoverflow.com/questions/8269037/ios-5-avaplayer-not-working-anymore
这个答案。。。不得不说外国人有时候也挺有才的。。。。
最后实在没有办法,就按工作经验来,打开build setting一个一个核对。。。。。。。
竟然发现:是开启了apple LLVM compiler的 "objective--c++ automatic reference counting ABI incompatibility"!!!
我去!!!这不是编译器自动替我计算引用计数的强大功能么。。。。。。。瞬间了悟了。
原来avplayer在play过后,运行到了作用域结尾,结束引用,被release掉了,声音自然就停了。
这个故事教育我们:1.出了问题不要都怪在苹果的LLVM上,大部分情况是代码本身的问题
2.不求甚解是一件多么具有摧毁力的事情。。。