所以当我写这篇文章时,我意识到这个问题有多具体......
我正在制作一个 iOS 应用程序,它可以在其他应用程序的音乐上播放声音,但是对于某些应用程序(到目前为止,实际上只有一个),我在播放该应用程序不播放时不会出现的声音时遇到了延迟它的音乐,即
- 使用Soundcloud应用程序开始播放
- 加载我的应用
- 按下按钮播放声音
- 声音播放
如果我省略第 1 步(或使用不同的应用程序,见下文),则 3 和 4 之间没有(可感知的)延迟,但将第 1 步保持在那里,我会在播放开始时听到一小段(~200 毫秒)延迟。
我尝试过AVAudioPlayer
使用[player prepareToPlay]
:
- (void)prepPlayer:(Sound *)sound
{
NSURL* pathURL = [NSURL fileURLWithPath:[sound getStoragePath] isDirectory:NO];
AVAudioPlayer* newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:pathURL error:&error];
[newPlayer prepareToPlay];
}
- (void)playSound
{
player.currentTime = 0;
[player play];
}
和AVAudioPlayerNode
//使用AVAudioEngine
:AVAudioMixerNode
- (void)prepQuickSound:(Sound *)sound
{
self.audioEngine = [[AVAudioEngine alloc] init];
self.audioMixerNode = [[AVAudioMixerNode alloc] init];
[self.audioEngine attachNode:self.audioMixerNode];
[self.audioEngine connect:self.audioMixerNode to:self.audioEngine.outputNode format:nil];
self.player = [[AVAudioPlayerNode alloc] init];
[audioEngine attachNode:playerNode];
[audioEngine connect:playerNode to:mixerNode format:nil];
NSURL* pathURL = [NSURL fileURLWithPath:[sound getStoragePath] isDirectory:NO];
NSError *audioLoadError = nil;
self.quickAudioFile = [[AVAudioFile alloc] initForReading:pathURL error:&audioLoadError];
}
- (void)playQuickSound
{
[self.player stop];
[self.player scheduleFile:self.quickAudioFile atTime:nil completionHandler:nil];
[self.player play];
}
...但无论如何我都看到了同样的延迟。
使用音乐 (iTunes) 应用程序或 Spotify 播放音乐时不会发生这种延迟,所以我猜这是 SoundCloud 应用程序特别在做的事情,但我想知道是否有办法绕过它。
我真的希望这里有人遇到类似的问题并解决了它 - 我无法从我的谷歌搜索中找到任何东西......