使用 AVAudioPlayer 延迟播放声音

Posted

技术标签:

【中文标题】使用 AVAudioPlayer 延迟播放声音【英文标题】:Delay in playing sounds using AVAudioPlayer 【发布时间】:2010-03-31 04:22:08 【问题描述】:
-(IBAction)playSound AVAudioPlayer *myExampleSound;

NSString *myExamplePath = [[NSBundle mainBundle] pathForResource:@"myaudiofile" ofType:@"caf"];

myExampleSound =[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:myExamplePath] error:NULL];

myExampleSound.delegate = self;

[myExampleSound play];


我想在单击按钮时播放哔声。我已经使用了上面的代码。但是播放声音需要一些延迟。

请大家帮忙。

【问题讨论】:

【参考方案1】:

延迟有两个来源。第一个更大,可以使用AVAudioPlayerprepareToPlay 方法消除。这意味着您必须将myExampleSound 声明为类变量并在需要它之前对其进行初始化(当然在初始化后调用prepareToPlay):

- (void) viewDidLoadOrSomethingLikeThat

    NSString *myExamplePath = [[NSBundle mainBundle]
        pathForResource:@"myaudiofile" ofType:@"caf"];
    myExampleSound =[[AVAudioPlayer alloc] initWithContentsOfURL:
        [NSURL fileURLWithPath:myExamplePath] error:NULL];
    myExampleSound.delegate = self;
    [myExampleSound prepareToPlay];


- (IBAction) playSound 
    [myExampleSound play];

这应该会将延迟降低到大约 20 毫秒,这可能适合您的需求。如果没有,您将不得不放弃AVAudioPlayer 并改用其他播放声音的方式(如Finch sound engine)。

另请参阅我自己关于 lags in AVAudioPlayer 的问题。

【讨论】:

【参考方案2】:

AudioservicesPlaySystemSound 是一个选项。教程here,示例代码here。

【讨论】:

但是你不能用这个控制音量。 据我所知,您一次只能播放一种声音。 根据我的经验,AudioServicesPlaySystemSound() 的延迟比AVAudioPlayer#.play() 的延迟要长或更长。

以上是关于使用 AVAudioPlayer 延迟播放声音的主要内容,如果未能解决你的问题,请参考以下文章

在其他 swift 文件中调用时,AVAudioPlayer 不会播放声音

使用 AVAudioPlayer 同时播放多个声音

touchesMoved中的SpriteKit + AVAudioPlayer:杀死fps

ios删除avaudioplayer循环延迟

使用 AVAudioPlayer 在后台播放声音序列

使用 AVAudioPlayer 播放声音时出现问题?