Audio 使用Cocos2D检测iPhone话筒中的敲击声

Audio 使用Cocos2D检测iPhone话筒中的敲击声,audio,cocos2d-iphone,recorder,Audio,Cocos2d Iphone,Recorder,我正在使用Cocos2D和系统粒子,我希望我用英语写的是正确的。 我无法以某种方式识别iPhone麦克风的声音 我的应用程序中有不同的部分,其中一部分我使用麦克风来检测是否有人在向麦克风“吹气”。这一部分在开始时可以正常工作,但如果你转到应用程序中播放声音的其他部分,然后你回到这个区域并尝试吹气,它将不起作用 我调试了代码,levelTimeCallback始终有效,即使我不在这个场景中。我真的不知道发生了什么。我已经停止使用所有声音 [[SimpleAudioEngine sharedEngi

我正在使用Cocos2D和系统粒子,我希望我用英语写的是正确的。 我无法以某种方式识别iPhone麦克风的声音

我的应用程序中有不同的部分,其中一部分我使用麦克风来检测是否有人在向麦克风“吹气”。这一部分在开始时可以正常工作,但如果你转到应用程序中播放声音的其他部分,然后你回到这个区域并尝试吹气,它将不起作用

我调试了代码,levelTimeCallback始终有效,即使我不在这个场景中。我真的不知道发生了什么。我已经停止使用所有声音

[[SimpleAudioEngine sharedEngine]stopBackgroundMusic]

有人知道我做错了什么吗?顺便说一句,它在模拟器中工作得很好,但在iPhone中却不行

记录器设置为onEnter方法

-(void) onEnter {
     [super onEnter];
     NSURL *url = [NSURL fileURLWithPath:@"/dev/null"];

     NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
                          [NSNumber numberWithFloat: 44100.0],                 AVSampleRateKey,
                          [NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
                          [NSNumber numberWithInt: 1],                         AVNumberOfChannelsKey,
                          [NSNumber numberWithInt: AVAudioQualityMax],         AVEncoderAudioQualityKey,
                          nil];

      NSError *error;

      recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];

      if (recorder) {
          [recorder prepareToRecord];
          recorder.meteringEnabled = YES;
          [recorder record];
          levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.03 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];
          NSLog(@"I'm in the recorder");

       } else

              NSLog(@"recorder error");
}

这是“检查”声音时的levelTimerCallback方法

同样的问题。 有两种方法可以解决这个问题

1:使用AVAudioPlayer播放音乐或音效

2:添加
#将“CDAudioManager.h”导入AppDelegate.m并添加


最后,在阅读了音频会话食谱和各种相关帖子后,我找到了解决方案。JU将此代码块放入init方法:

    UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
    AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
    AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride);
    AudioSessionSetActive(true);

嗨@huyleit!谢谢你的回答!我找到的解决方案是:为了在init方法中添加一些代码,我用该解决方案修改了我的原始帖子。非常感谢您的回答,我将尝试您的解决方案。
 [CDAudioManager initAsynchronously:kAMM_PlayAndRecord];
- (void) applicationDidFinishLaunching:(UIApplication*)application`
    UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
    AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
    AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride);
    AudioSessionSetActive(true);