我有一套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;
}
答案 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"