使用 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 = 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"
最后,您可以将函数中的代码改为:
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 播放多个声音(一个接一个)
(iphone) 如何使用 AVAudioPlayer 顺序播放声音?