如何使用Unity和IOS检测麦克风中的打击

如何使用Unity和IOS检测麦克风中的打击

本文介绍了如何使用Unity和IOS检测麦克风中的打击的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道有多个线程存在相同的问题,但是我无法使其解决方案正常工作.我最终创建了此类:

I'm aware that there are several threads with the same problem, but i haven't been able to make their solution work. I ended up creating this class:

MicroController.h

MicroController.h

#import Foundation/Foundation.h>

#import <AVFoundation/AVFoundation.h>
#import <CoreAudio/CoreAudioTypes.h>

#import <UIKit/UIKit.h>

@interface MicroController : UIView < UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, AVAudioSessionDelegate > {
    AVAudioRecorder *recorder;
    NSTimer *levelTimer;
    double lowPassResults;
}

- (void)levelTimerCallback:(NSTimer *)timer;
@end

MicroController.mm

MicroController.mm

#import "MicroController.h"


@implementation MicroController

- (id)init
{
    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;

        if ([recorder prepareToRecord] == YES){
            [recorder record];
        }else {
            int errorCode = CFSwapInt32HostToBig ([error code]);
            NSLog(@"Error: %@ [%4.4s])" , [error localizedDescription], (char*)&errorCode);

        }

        levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.03 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];
    } else
        NSLog([error description]);

    // input 'level' is in meter.mAveragePower

    return self;
}

- (void)levelTimerCallback:(NSTimer *)timer {
    [recorder updateMeters];

    const double ALPHA = 1.0; // 0.05f
    double peakPowerForChannel = pow(10, (0.05 * [recorder peakPowerForChannel:0]));
    lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;

    if (lowPassResults > 0.55)
        NSLog(@"Mic blow detected");


    [recorder updateMeters];
    NSLog(@"Average input: %f Peak input: %f", [recorder averagePowerForChannel:0], [recorder peakPowerForChannel:0]);

}
    - (void)viewDidLoad {
        [super viewDidLoad];

        NSLog(@"initiated");

        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];
        } else
            NSLog([error description]);

    }


    - (void)dealloc {
        [levelTimer release];
        [recorder release];
        [super dealloc];
    }
    @end

但是我无法使麦克风正常工作.我仅收到此输出,并且麦克风永不响应:

But I can't get to make the microphone work. I'm getting only this output, and the microphone never responds:

平均输入:-120.000000峰值输入:-120.000000

Average input: -120.000000 Peak input: -120.000000

关于什么是错的任何想法?

Any idea about what can be wrong ?

感谢您的帮助!

推荐答案

好吧,我不认为提及我正在团结一致,这是罪魁祸首.

Well, I didn't think important to mention that i was working with unity, and it was the culprit.

Unity修改了一些设置,因此在加载ViewController时一定要这样做:

Unity modifies some settings, so it's important to do this when you load your viewcontroller:

[[AVAudioSession sharedInstance]
 setCategory: AVAudioSessionCategoryPlayAndRecord
 error: &setCategoryError];
if (setCategoryError) {
    NSLog([setCategoryError description]);
}

否则,完美编写的录音机将无法正常工作.就是这样..问题解决了!

Otherwise a perfectly written audiorecorder won't work correctly. And that was it..problem solved !

此错误是一个易于检测的错误,希望此消息对处于同样困境的其他人有所帮助.

This bug was a PAIN to detect, I hope this message helps anyone else in the same predicament.

这篇关于如何使用Unity和IOS检测麦克风中的打击的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-24 16:57