使用AVAudioPlayer一次播放多个声音

时间:2014-12-28 22:36:02

标签: objective-c avaudioplayer

我有一套UIButtons。每次按下按钮,都会播放声音。问题:当您按下一个按钮并播放后面的声音时,按第二个按钮时,来自第一个按钮的声音将停止。

这个问题已被问过一百万次。解决方案始终是每次都创建一个AVAudioPlayer的新实例。我试过了,但没有用。我已经阅读了文档,阅读了与此相关的StackOverflow上的每个问题,并且没有运气。当我使用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;
}

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

考虑一下:

g++ -W -Wall -pedantic filename.cpp

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

4

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

y

我们走了。现在我们有y = 3 x = 4。两个变量,包含两个值。

这与音频播放器的实例一致。无论按钮是第一个还是第二个,音频播放器都会被重置为您要播放的任何声音的实例。所以,会发生什么,音频播放器会忘记第一个声音并播放第二。将y = 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"