AVAudioPlayer 声音在经过这么多 IBAction 后停止播放
Posted
技术标签:
【中文标题】AVAudioPlayer 声音在经过这么多 IBAction 后停止播放【英文标题】:AVAudioPlayer sounds stop playing after so many IBActions 【发布时间】:2011-06-02 15:27:05 【问题描述】:我有一个简单的交互式应用程序,其中包含 10 个 IBAction,每个都与动画和声音相关联。多次点击后声音停止工作(虽然在音乐按钮的情况下它会继续播放,但没有其他声音会起作用,但一旦关闭,所有声音都会停止)但动画和其他一切运行正常。这是很多水龙头......但经过几分钟的互动,即。 50 左右的水龙头会发生这种情况。
我发现仪器没有泄漏...一切看起来都很好,只是停止工作了吗?
有什么想法会发生什么吗?
我正在使用带有代码的 AVAudioPlayer 框架
AVAudioPlayer *bubblesound;
-(IBAction) getBubbles:(id)sender
NSString *bubblesgoblip = [[NSBundle mainBundle] pathForResource:@"boingy1" ofType:@"mp3"];
bubblesound = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:bubblesgoblip] error:NULL];
[bubblesound play];
-(void)dealloc
[bubblesound release];
【问题讨论】:
你将不得不发布一些代码,因为在 ios 中有不同的方式来播放声音。 我正在使用 AVAudioPlayer 框架 【参考方案1】:奇怪的是,当你一次又一次地启动气泡声音时,你没有泄漏。
任何方式:
如果您正在播放短按钮音效,您最好尝试使用“SystemSoundID”而不是 AVAudioPlayer。这就是苹果推荐的。
已编辑 苹果有一个很好的例子,其中包含这个文件 -
.h 文件
#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioServices.h>
@interface SoundEffect : NSObject
SystemSoundID _soundID;
+ (id)soundEffectWithContentsOfFile:(NSString *)aPath;
- (id)initWithContentsOfFile:(NSString *)path;
- (void)play;
@end
.m 文件
#import "SoundEffect.h"
@implementation SoundEffect
+ (id)soundEffectWithContentsOfFile:(NSString *)aPath
if (aPath)
return [[[SoundEffect alloc] initWithContentsOfFile:aPath] autorelease];
return nil;
- (id)initWithContentsOfFile:(NSString *)path
self = [super init];
if (self != nil)
NSURL *aFileURL = [NSURL fileURLWithPath:path isDirectory:NO];
if (aFileURL != nil)
SystemSoundID aSoundID;
OSStatus error = AudioServicesCreateSystemSoundID((CFURLRef)aFileURL, &aSoundID);
if (error == kAudioServicesNoError) // success
_soundID = aSoundID;
else
NSLog(@"Error %ld loading sound at path: %@", error, path);
[self release], self = nil;
else
NSLog(@"NSURL is nil for path: %@", path);
[self release], self = nil;
return self;
-(void)dealloc
AudioServicesDisposeSystemSoundID(_soundID);
[super dealloc];
-(void)play
AudioServicesPlaySystemSound(_soundID);
@end
现在您可以准备加载视图中的声音 -
NSBundle *mainBundle = [NSBundle mainBundle];
sound1 = [[SoundEffect alloc] initWithContentsOfFile:[mainBundle pathForResource:@"doorloop1" ofType:@"caf"]];
sound2 = [[SoundEffect alloc] initWithContentsOfFile:[mainBundle pathForResource:@"doorloop1" ofType:@"caf"]];
最后在你的行动中
-(IBAction) getBubbles:(id)sender
[sound1 play];
不要忘记释放声音。
【讨论】:
我按照你的建议尝试了,也改变了 [self.bubblesound stop];到[气泡音释放];在 if 语句中,应用程序最终仍然停止播放声音,与以前一样,仍然显示乐器没有泄漏,并且在模拟器中运行时也不存在此问题。我会调查 SystemSoundID,谢谢你的信息。 很酷,谢谢,我会试试这个!我已经好几天没有机会了,但希望我今天能完成这项工作! 另外,对于我的老问题,即使仪器没有显示“泄漏”,每次我触摸与声音相关的动作时,我的分配都会不断增长,直到所有声音停止。 你能贴出你正在使用的代码吗?你在视图中“准备你的声音”了吗?或者任何时候你点击一个按钮?发布您的代码,我会尽力提供帮助。 呃,仍在使用上面的 systemsoundID 示例解决此问题,但我有一些错误要弄清楚,抱歉,越来越多的分配评论与我一直在使用的旧 avaudioplayer 代码有关。以上是关于AVAudioPlayer 声音在经过这么多 IBAction 后停止播放的主要内容,如果未能解决你的问题,请参考以下文章