iPhone 上的 AVAudioPlayer 声音意外停止循环:如何调试?
Posted
技术标签:
【中文标题】iPhone 上的 AVAudioPlayer 声音意外停止循环:如何调试?【英文标题】:AVAudioPlayer sound on iPhone stops looping unexpectedly: How to debug? 【发布时间】:2009-05-30 17:48:07 【问题描述】:我正在实现在用户拖动 UISlider 时播放的声音效果。
在previous question 中,我使用了AudioServicesPlaySystemSound(),但这种声音无法停止。当用户没有主动拖动滑块但没有释放它时,我需要停止声音。
现在我正在使用 AVAudioPlayer 对象创建声音。我在我的视图控制器中初始化它,如下所示:
@interface AudioLatencyViewController : UIViewController <AVAudioPlayerDelegate>
AVAudioPlayer *player1;
@implementation AudioLatencyViewController
@property (nonatomic, retain) AVAudioPlayer *player1;
@synthesize player1;
-(void)viewDidLoad
[super viewDidLoad];
// the sound file is 1 second long
NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"tone1" ofType:@"caf"];
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:soundFilePath];
AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];
[fileURL release];
self.player1 = newPlayer;;
[newPlayer release];
[self.player1 prepareToPlay];
[self.player1 setDelegate:self];
我有两种方法来控制声音。当滑块移动时,第一个播放声音。它连接到 UISlider 在 Interface Builder 中的 Value Changed 事件。
-(IBAction)sliderChanged:(id)sender;
// only play if previous sound is done. helps with stuttering
if (![self.player1 isPlaying])
[self.player1 play];
第二种方法在用户释放滑块按钮时停止声音。它连接到 UISlider 的 Touch Up Inside 事件。
-(IBAction)haltSound;
[self.player1 stop];
这在移动滑块按钮然后快速释放时有效,但如果您按住按钮超过两三秒,声音会重复(好)然后中断(坏)。从那时起,声音将不再播放(超级糟糕)。
我尝试使用以下方法将声音设置为循环播放:
[self.player1 setNumberOfLoops:30];
...但这会导致应用程序冻结(加上锁定模拟器)。
我可以做些什么来调试这个问题?
【问题讨论】:
【参考方案1】:当用户拿着 UISlider 时,Value Changed 会被调用很多次(只要用户移动了一点点)。我会改用 Touch Down。
您可能仍想尝试对这条路线使用循环...
我喜欢在用户移动滑块时播放声音的想法。让我知道结果如何。
deggstand@gmail.com
【讨论】:
以上是关于iPhone 上的 AVAudioPlayer 声音意外停止循环:如何调试?的主要内容,如果未能解决你的问题,请参考以下文章
iPhone:AVAudioPlayer 是不是支持 .wav 格式?