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 声音意外停止循环:如何调试?的主要内容,如果未能解决你的问题,请参考以下文章

AVAudioPlayer 在停止或恢复时“滴答”

静音按钮不会静音 AVAudioPlayer

如何开启 Mac 上的充电提醒声

iPhone:AVAudioPlayer 是不是支持 .wav 格式?

iPhone:如何使用 AVAudioPlayer 检测 Iphone/Ipod 音量级别

iPhone:MPMusicPlayerController 停止 AVAudioPlayer