如何检测音效播放完毕?

9

我正在使用SimpleAudioEngine,并尝试在继续之前检测音效是否完成播放。

我正在寻找任何方法,但我尝试实现的那个方法不起作用!

CDSoundEngine *engine = [CDAudioManager sharedManager].soundEngine;    
ALuint soundId = [[SimpleAudioEngine sharedEngine] playEffect:soundId];

float seconds = [engine bufferDurationInSeconds:soundId];

每次我使用bufferDurationInSeconds时,它都会将一个浮点值-1返回到变量秒中。我检查了实现,当ID无效时,它会返回-1,但我百分之百确定ID是有效的!有人可以帮我解决这个问题,或者建议我另一种方法来检测声音效果的结束吗?

这可能会指引你朝着正确的方向前进。 - jverrijt
1个回答

9

拿到CDSoundSource,然后从中获取soundId即可。

(第二行是可选的,它只是播放声音)。

CDSoundEngine *engine = [CDAudioManager sharedManager].soundEngine;
[[SimpleAudioEngine sharedEngine] playEffect:@"soundeffect.m4a"];
CDSoundSource *aSound =[[SimpleAudioEngine sharedEngine] soundSourceForFile:@"soundeffect.m4a"];
float seconds = [engine bufferDurationInSeconds:aSound.soundId];

另外,为了在音频播放完毕后立即运行一个方法,我会使用一个NSTimer来使用秒数结果。

[NSTimer scheduledTimerWithTimeInterval:seconds target:self selector:@selector(aMethod) userInfo:nil repeats:NO];

然后,最终方法实现了某些东西。

-(void)aMethod 
{
NSLog(@"finished playing");
}

虽然这不会影响到结果为 -1,但我必须指出,在您的代码中,soundId 变量以两种不同的方式出现在同一行中,这将导致问题。不过别担心,我已经成功地测试了上述方法。

ALuint **soundId** = [[SimpleAudioEngine sharedEngine] playEffect:**soundId**];

太棒了!我疯了一样地试图找到这个答案。 - Hahnemann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接