我是相当新的 Xcode 和 ObjC,我无法通过多个 AVAudioPlayers 播放多个音频文件。
从理论上讲,我的应用程序相当简单,它采用汽车 RPM 和 Load 值并根据这些值播放声音。
因此,对于一系列 RPM 值,我有 13 个声音样本。我的代码确定了它们应该播放的音量和速率,以在应用程序中复制正确的引擎声音 - 请注意,它们都在同时播放,控制它们的声音的是音量和速率。
所以,我算出这样的数量和费率(这是一个片段):
if ((rpm > 4989) && (rpm < 5339)) {
av1Pitch = 0.0f;
av2Pitch = 0.0f;
av3Pitch = 0.0f;
av4Pitch = 0.0f;
av5Pitch = 0.0f;
av6Pitch = 0.0f;
av7Pitch = 0.0f;
av8Pitch = 0.0f;
av9Pitch = rpm / 4989.0f;
av10Pitch = rpm / 5338.0f;
av11Pitch = 0.0f;
av12Pitch = 0.0f;
av13Pitch = 0.0f;
av1Volume = 0.0f;
av2Volume = 0.0f;
av3Volume = 0.0f;
av4Volume = 0.0f;
av5Volume = 0.0f;
av6Volume = 0.0f;
av7Volume = 0.0f;
av8Volume = 0.0f;
av9Volume = av9Pitch - 1.0f;
av10Volume = 1.0f - av9Volume;
av11Volume = 0.0f;
av12Volume = 0.0f;
av13Volume = 0.0f;
}
然后我浏览 13 个 AVAudioPlayers 并设置播放器的音量和速率:
if (audioPlayer2000.isPlaying) {
//already playing, ready for volume / pitch adjustments
audioPlayer2000.volume = av2Volume;
audioPlayer2000.rate = av2Pitch;
}
else{
//nothing playing - play the file
NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/1052.wav", [[NSBundle mainBundle] resourcePath]]];
NSError *error;
//NSData *songFile2 = [[NSData alloc] initWithContentsOfURL:url options:NSDataReadingMappedIfSafe error:&error];
audioPlayer2000 = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
//audioPlayer2000 = [[AVAudioPlayer alloc] initWithData:songFile2 error:&error];
audioPlayer2000.numberOfLoops = -1;
audioPlayer2000.enableRate = YES;
audioPlayer2000.rate = av2Pitch;
audioPlayer2000.volume = av2Volume;
if (audioPlayer2000 == nil) {
NSLog([error description]);
}
else{
[audioPlayer2000 play];
}
}
这在播放 1 个文件时工作正常,但是一旦我更改 RPM 值以便它应该播放另一个文件,无论 RPM 值是多少,所有声音都会停止。
我发现阻止这种情况的唯一方法是在播放器上调用 setCurrentTime - 但这会导致“抖动”播放。
我认为可能是 ARC 在播放,所以我为所有玩家创建了属性。
我在这里错过了一些基本的东西吗?还是我没有采取正确的方法?