使用 AVAudioPlayer 一次播放多个声音

Posted

技术标签:

【中文标题】使用 AVAudioPlayer 一次播放多个声音【英文标题】:Playing Multiple Sounds at Once Using AVAudioPlayer 【发布时间】:2014-12-28 22:36:01 【问题描述】:

我有一组 UIButton。每按一次按钮,就会响起声音。问题:当你按下一个按钮并且播放后面的声音时,当你按下第二个按钮时,来自第一个按钮的声音停止。

这个问题已经被问了一百万次了。解决方案是每次都创建一个新的 AVAudioPlayer 实例。我试过了,没有用。我已经阅读了文档,阅读了 *** 上与此相关的所有问题,但运气不佳。当我使用 SystemSoundID 时,它们每次都同时播放……但我不得不牺牲音量控制能力。这是我正在使用的代码:

 NSString *soundOne = [[NSUserDefaults standardUserDefaults] valueForKey:senderString];

    NSURL *url = [NSURL URLWithString:[soundOne stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

    _audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];

    switch ([sender tag]) 

        case 1:
            [_audioPlayer prepareToPlay];
            [_audioPlayer play];
            NSLog(@"Playing: %@", soundOne);
            break;

        case 2:
            [_audioPlayer prepareToPlay];
            [_audioPlayer play];
            NSLog(@"Playing: %@", soundOne);
            break;

【问题讨论】:

【参考方案1】:

问题是您的代码在制作新的音频播放器时,也会破坏旧的音频播放器。您必须同时存在两个音频播放器,才能让它们同时播放两种声音。当您只有一个实例变量 _audioPlayer 时,这是不可能发生的。

【讨论】:

所以我需要在每个案例中添加_audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; 改用 _audioPlayer1 和 _audioPlayer2 我认为这里需要的是对变量是什么的基本了解。你不能把两只鞋放在一个鞋盒里…… @matt 我理解变量就好了,AVAudioPlayer 是我不理解的。 @John 我不认为你这样做。如果你这样做了,你就不会问你要问的问题。试着记住你是提问者——这意味着你理解。变量的一个主要特征是它们导致它们所指的事物持续存在。如果您有 _audioPlayer 引用一个 AVAudioPlayer,并且您将 _audioPlayer 设置为另一个 AVAudioPlayer - 这就是您一直在做的 - 那么第一个 AVAudioPlayer 将不再被引用,因此不再存在。这就是声音停止的原因:没有什么可以再发出这种声音了。【参考方案2】:

取自matt的回答,播放第二个声音会破坏第一个。

考虑一下:

x = 3

我们只是将x 设置为等于3。现在,我们需要存储另一个号码,4。现在,我们有了这个:

x = 4

等等,我们刚刚将 x 指定为 4。我们忘记了3。我们需要第二个变量来保存3。为什么不y

y = 3

我们去吧。现在我们有x = 4y = 3。两个变量,持有两个值。

这与音频播放器的实例一起使用。无论按钮是第一个还是第二个,音频播放器都会被重置为您想要播放的任何声音的实例。因此,音频播放器会忘记第一个声音并播放第二。这就像将x 重置为4,而不是3

就像上面的解决方案一样,你需要第二个变量。


在您的 .h 文件中替换它...

@property AVAudiosession* audioPlayer;

与...

@property AVAudioSession* audioPlayer1;
@property AVAudioSession* audioPlayer2;

我还需要注意的是,在您的代码中,您总是在每次播放声音时重新初始化音频播放器,并且您只能播放一个声音。在您的.m 文件中,复制/粘贴此函数,或将相关代码添加到您的init 函数中。

-(instancetype)init 
    self = [super init];
    if (self) 
        self->_audioPlayer1 = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL URLWithString:[[[NSUserDefaults standardUserDefaults] valueForKey:Sound1] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]]];
        self->_audioPlayer2 = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL URLWithString:[[[NSUserDefaults standardUserDefaults] valueForKey:Sound2] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]]];
        [self->_audioPlayer1 prepareToPlay];
        [self->_audioPlayer2 prepareToPlay];
    

并且,在您的 .h 文件中,添加:

#define Sound1 @"your first key name"
#define Sound2 @"your second key name"

最后,您可以将函数中的代码改为:

NSLog(@"Playing sound with sender tag: %i", [sender tag]);
switch ([sender tag]) 
    case 1:
    
        [_audioPlayer1 play];
        break;
    
    case 2:
    
        [_audioPlayer2 play];
        break;
    
    default:
    
        break;
    

【讨论】:

以上是关于使用 AVAudioPlayer 一次播放多个声音的主要内容,如果未能解决你的问题,请参考以下文章

使用 AVAudioPlayer 同时播放多个声音

使用 AVAudioPlayer 播放多个声音(一个接一个)

(iphone) 如何使用 AVAudioPlayer 顺序播放声音?

AVAudioPlayer 多重声音嘈杂

AVAudioPlayer 重置当前播放的声音并从头开始播放

Swift 3 多个 AVAudioPlayer