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 后停止播放的主要内容,如果未能解决你的问题,请参考以下文章

使用 AVAudioPlayer 在后台播放声音序列

AVAudioPlayer- 从声音缓冲区播放

AVAudiorecorder 和 AVAudioPlayer 并不总是播放声音

如何播放与 AVAudioPlayer 重叠的相同声音?

AVAudioPlayer 多重声音嘈杂

Swift - AVAudioPlayer,声音播放不正确