目标c-对着麦克风吹气,播放1个声音,而不是多个定时器触发



我在这里使用这个很棒的教程来检测何时有人对着麦克风吹气。

我的最终目标是当有人对着手机吹气时播放一个声音,当他们没有对着手机吹气的时候停止;但是,由于此示例是基于计时器的,因此它每秒触发此if语句30次(请参阅教程中计时器的示例代码)。

if (lowPassResults > 0.95) {
    NSLog(@"Mic blow detected");
    self.audioSource = [[OALSimpleAudio sharedInstance] playEffect:audioSound volume:1.0 pitch:1.0 pan:0 loop:NO];
}   
if (lowPassResults  < 0){
    NSLog(@"PLEASE STOP?");
    [self.keyCSource stop];
}

有人有什么想法来听"吹",如果它被吹进了,那么播放一次ObjectAL声音,然后在没有被吹进的时候停止它?

这对你来说不起作用,因为只要你的低通结果超过阈值,你就会每秒重新启动声音30次。以下是解决此问题的方法。

确保您有某种持久性标志BOOL is_playing,并在最初将其设置为NO。当超过阈值时,测试is_playing。仅当是NO时,才使用loop:YES调用playEffect,并将is_playing设置为YES

如果低通结果低于阈值stopAllEffects,则将is_playing设置为NO。你还应该重新考虑你的下限是否真的应该为零。它可能会高得多,高达0.95。

据我所知,你可以检测到打击,而你的问题是,你只想播放一次声音。否则忽略我的回答

创建属性@property BOOL blowDetected,在检测到打击时将其设置为YES,在停止声音时(或准备检测到另一次打击时)将其设置成NO。然后只播放声音if (!self.blowDetected)

更多细节:

if (meterResults > 0.95) {
    NSLog(@"isPlaying");
    _isPlaying = YES;
}

到目前为止还不错,但在这里你还想开始播放你的声音,并且只有当_isPlaying == NO

if (!_isPlaying && meterResults > 0.95) {
    self.keyCSource = [[ ... and so on
    _isPlaying = YES;
}

然后,当meterResult下降时

if (lowPassResults  < 0){
    _isPlaying = NO;
    [self.keyCSource stop];
}

最新更新