2011-06-14 17 views
0

同じ問題を抱えているスレッドはいくつかありますが、私は解決策を出すことができませんでした。私はこのクラスの作成終わった:UnityとIOSを使用してマイクの吹き飛ばしを検出する方法

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

#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 

をしかし、私はマイクの仕事をするために取得することはできません。私はこの出力を得ている、とマイクが応答しません:

平均入力:-120.000000ピーク入力:-120.000000

間違っていることができるかについての任意のアイデアを?

ありがとうございました!

答えて

7

まあ、私は団結して働いていると言っても大したことはないと思っていましたが、それが原因でした。

Unityはいくつかの設定を変更しますので、あなたがあなたのViewControllerをロードするときには、これを行うことが重要です:

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

それ以外の場合は完全に書かれたaudiorecorderが正しく動作しません。そして、それは問題解決になりました!

このバグは検出する痛みでした。私は、このメッセージが同じ苦境にいる他の誰にも役立つことを願っています。

0

私はチタンのappceleratorを使用する場合、私は同じ問題があります。

#import "MicController.h" 


    static MicController *sharedListener = nil; 


    @implementation MicController 


    + (MicController *)sharedListener { 
     @synchronized(self) { 
      if (sharedListener == nil) 
       [[self alloc] init]; 
     } 

     return sharedListener; 
    } 

    - (void)dealloc { 
     //[sharedListener stop]; 
     //[levelTimer release]; 
     [recorder release]; 
     [super dealloc]; 
    } 

    #pragma mark - 
    #pragma mark Listening 

    - (void)listen { 

     NSURL *url = [NSURL fileURLWithPath:@"/dev/null"]; 

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

     NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys: 
            [NSNumber numberWithFloat: 44100.0],     AVSampleRateKey, 
            [NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey, 
            [NSNumber numberWithInt: 2],       AVNumberOfChannelsKey, 
            [NSNumber numberWithInt: AVAudioQualityMax],   AVEncoderAudioQualityKey, 
            nil]; 
            /* 
            [NSNumber numberWithFloat: 44100.0],     AVSampleRateKey, 
            [NSNumber numberWithInt: kAudioFormatMPEG4AAC],  AVFormatIDKey, 
            [NSNumber numberWithInt: 2],       AVNumberOfChannelsKey, 
            [NSNumber numberWithInt: AVAudioQualityMax],   AVEncoderAudioQualityKey, 
            [NSNumber numberWithInt:16],       AVLinearPCMBitDepthKey, 
            [NSNumber numberWithBool:NO],       AVLinearPCMIsBigEndianKey, 
            [NSNumber numberWithBool:NO],       AVLinearPCMIsFloatKey, 
            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)stop { 
     [recorder release]; 
    } 

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

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

     //if (lowPassResults < 0.95) 
     //NSLog(@"Mic blow detected"); 
     NSLog(@"Average input: %f Peak input: %f Low pass results: %f", [recorder averagePowerForChannel:0], [recorder peakPowerForChannel:0], lowPassResults); 


    } 
    */ 

    #pragma mark - 
    #pragma mark Levels getters 

    - (Float32)averagePower { 
     [recorder updateMeters]; 

     const double ALPHA = 0.7; 
     double peakPowerForChannel = pow(10, (0.05 * [recorder averagePowerForChannel:0])); 
     lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults; 
     return [recorder averagePowerForChannel:0]; 
     //return lowPassResults; 
     //NSLog(@"Average input: %f Peak input: %f Low pass results: %f", [recorder averagePowerForChannel:0], [recorder peakPowerForChannel:0], lowPassResults); 

    } 
    - (Float32)peakPower { 
     [recorder updateMeters]; 

     const double ALPHA = 0.7; 
     double peakPowerForChannel = pow(10, (0.05 * [recorder peakPowerForChannel:0])); 
     lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults; 
     return [recorder peakPowerForChannel:0]; 
     //return lowPassResults; 
     //NSLog(@"Average input: %f Peak input: %f Low pass results: %f", [recorder averagePowerForChannel:0], [recorder peakPowerForChannel:0], lowPassResults); 

    } 

    #pragma mark - 
    #pragma mark Singleton Pattern 

    + (id)allocWithZone:(NSZone *)zone { 
     @synchronized(self) { 
      if (sharedListener == nil) { 
       sharedListener = [super allocWithZone:zone]; 
       return sharedListener; 
      } 
     } 

     return nil; 
    } 

    - (id)copyWithZone:(NSZone *)zone { 
     return self; 
    } 

    - (id)init { 
     if ([super init] == nil) 
      return nil; 

     return self; 
    } 

    - (id)retain { 
     return self; 
    } 

    - (unsigned)retainCount { 
     return UINT_MAX; 
    } 

    //- (void)release { 
     // Do nothing. 
    //} 

    - (id)autorelease { 
     return self; 
    } 


@end 

私の質問がある

// 
// MicController.h 
// Mic 
// 
// Created by DekWilde on 10/26/11. 
// Copyright 2011 DekWilde. All rights reserved. 
// 

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

@interface MicController : NSObject { 
    AVAudioRecorder *recorder; 
    //NSTimer *levelTimer; 
    double lowPassResults; 
} 

+ (MicController *)sharedListener; 
- (void)listen; 
- (void)stop; 
//- (void)levelTimerCallback:(NSTimer *)timer; 
- (Float32)averagePower; 
- (Float32)peakPower; 
@end 

とMicController.m:シミュレータでのクラスの仕事を正しくが、デバイスではない、平均入力=ここ-120 はコードです。ここで、iこの問題の解決策について投稿したこのコードを記述する必要があります。 。 。どのように私はこの問題を解決することができますか?ここ

1

OKは、解決です: ファイル "MicController.m"

#import "MicController.h" 


static MicController *sharedListener = nil; 


@implementation MicController 


+ (MicController *)sharedListener { 
    @synchronized(self) { 
     if (sharedListener == nil) 
      [[self alloc] init]; 
    } 

    return sharedListener; 
} 

- (void)dealloc { 
    //[sharedListener stop]; 
    //[levelTimer release]; 
    [recorder release]; 
    [super dealloc]; 
} 

#pragma mark - 
#pragma mark Listening 

- (void)listen { 

    [[AVAudioSession sharedInstance] 
    setCategory: AVAudioSessionCategoryPlayAndRecord 
    error: nil]; 




    NSURL *url = [NSURL fileURLWithPath:@"/dev/null"]; 

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

    NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys: 
           [NSNumber numberWithFloat: 44100.0],     AVSampleRateKey, 
           [NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey, 
           [NSNumber numberWithInt: 2],       AVNumberOfChannelsKey, 
           [NSNumber numberWithInt: AVAudioQualityMax],   AVEncoderAudioQualityKey, 
           nil]; 
           /* 
           [NSNumber numberWithFloat: 44100.0],     AVSampleRateKey, 
           [NSNumber numberWithInt: kAudioFormatMPEG4AAC],  AVFormatIDKey, 
           [NSNumber numberWithInt: 2],       AVNumberOfChannelsKey, 
           [NSNumber numberWithInt: AVAudioQualityMax],   AVEncoderAudioQualityKey, 
           [NSNumber numberWithInt:16],       AVLinearPCMBitDepthKey, 
           [NSNumber numberWithBool:NO],       AVLinearPCMIsBigEndianKey, 
           [NSNumber numberWithBool:NO],       AVLinearPCMIsFloatKey, 
           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)stop { 
    [recorder release]; 
} 

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

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

    //if (lowPassResults < 0.95) 
    //NSLog(@"Mic blow detected"); 
    NSLog(@"Average input: %f Peak input: %f Low pass results: %f", [recorder averagePowerForChannel:0], [recorder peakPowerForChannel:0], lowPassResults); 


} 
*/ 

#pragma mark - 
#pragma mark Levels getters 

- (Float32)averagePower { 
    [recorder updateMeters]; 

    const double ALPHA = 0.7; 
    double peakPowerForChannel = pow(10, (0.05 * [recorder averagePowerForChannel:0])); 
    lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults; 
    return [recorder averagePowerForChannel:0]; 
    //return lowPassResults; 
    //NSLog(@"Average input: %f Peak input: %f Low pass results: %f", [recorder averagePowerForChannel:0], [recorder peakPowerForChannel:0], lowPassResults); 

} 
- (Float32)peakPower { 
    [recorder updateMeters]; 

    const double ALPHA = 0.7; 
    double peakPowerForChannel = pow(10, (0.05 * [recorder peakPowerForChannel:0])); 
    lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults; 
    return [recorder peakPowerForChannel:0]; 
    //return lowPassResults; 
    //NSLog(@"Average input: %f Peak input: %f Low pass results: %f", [recorder averagePowerForChannel:0], [recorder peakPowerForChannel:0], lowPassResults); 

} 

#pragma mark - 
#pragma mark Singleton Pattern 

+ (id)allocWithZone:(NSZone *)zone { 
    @synchronized(self) { 
     if (sharedListener == nil) { 
      sharedListener = [super allocWithZone:zone]; 
      return sharedListener; 
     } 
    } 

    return nil; 
} 

- (id)copyWithZone:(NSZone *)zone { 
    return self; 
} 

- (id)init { 
    if ([super init] == nil) 
     return nil; 

    return self; 
} 

- (id)retain { 
    return self; 
} 

- (unsigned)retainCount { 
    return UINT_MAX; 
} 

- (void)release { 
    // Do nothing. 
} 

- (id)autorelease { 
    return self; 
} 


@end 

ちょうど

[[AVAudioSession sharedInstance] 
    setCategory: AVAudioSessionCategoryPlayAndRecord 
    error: nil]; 

・デ・ボイド上記のコードを追加します -

"(無効){聞きます"

ありがとうございます。 Bye

0

Unity 3.5がMicrophone入力のサポートを追加しました。Unityでこれを行うことをお勧めします。これで、Cocoaコードを維持したり、Android/Web/Nativeに簡単に移植する必要はありません未来。

http://forum.unity3d.com/threads/123036-iOS-Microphone-input

http://forum.unity3d.com/threads/118215-Blow-detection-(Using-iOS-Microphone

はすでにこのことについていくつかの有用な記事があります

関連する問題