2010-08-01 79 views

回答

2

是的,

您可以使用AudioRecord類和分析回來的波形。

編輯:只做了一些研究 - 一個告誡。事實證明,Android不能很好地處理音頻處理。你會看到100ms的延遲。如果你的項目沒有問題(可能它聽起來像)很好,但只是需要注意的一點。

0

添加AVFoundation框架

爲了使用SDK的AVAudioRecorder類,我們需要的AVFoundation框架添加到項目:

接下來,我們將在進口AVFoundation頭我們的視圖控制器的界面文件並設置AVAudioRecorder實例變量:

展開組&項目中的文件面板中的MicBlow項目分支 展開類文件夾 編輯MicBlowViewController.h通過選擇它 更新文件:

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

@interface MicBlowViewController : UIViewController { 
AVAudioRecorder *recorder; 
} 

以輸入從MIC 取消對樣板viewDidLoad方法如下 更新它。

- (void)viewDidLoad { 
[super viewDidLoad]; 

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

} 

採樣的音頻電平 我們將使用一個計時器來檢查音頻電平,大約每秒30次。在MicBlowViewController.h中添加一個NSTimer實例變量及其回調方法。

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

@interface MicBlowViewController : UIViewController { 
AVAudioRecorder *recorder; 
NSTimer *levelTimer; 
    } 

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

    @end 

更新.m文件的ViewDidLoad以啓用計時器。 - (void)viewDidLoad {super viewDidLoad];

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]); 

}

現在,我們就直接採樣音頻輸入電平/不帶過濾。添加levelTimerCallback實施:到.m文件:

- (void)levelTimerCallback:(NSTimer *)timer { 
[recorder updateMeters]; 
NSLog(@"Average input: %f Peak input: %f", [recorder averagePowerForChannel:0],  [recorder peakPowerForChannel:0]); 

}

發送updateMeters消息刷新平均值和峯值功率計。儀表使用對數刻度,-160完全靜音,零是最大輸入。

不要忘記在dealloc中釋放定時器。變化是大膽:

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

聽了一吹聲 ,我們將使用一個低通濾波器,減少高頻聲音的水平貢獻正如概覽中所提到。該算法創建一組運行結果併入過去的採樣輸入;我們需要一個實例變量來保存結果。更新.h文件。

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

@interface MicBlowViewController : UIViewController { 
AVAudioRecorder *recorder; 
NSTimer *levelTimer; 
double lowPassResults; 
} 

通過更換levelTimerCallback實現的算法:法:

- (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; 

NSLog(@"Average input: %f Peak input: %f Low pass results: %f", [recorder  averagePowerForChannel:0], [recorder peakPowerForChannel:0], lowPassResults); 
} 

對於我的應用程序的需要,0.95作品。我們將用一個簡單的條件替換日誌行:

- (void)listenForBlow:(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"); 
} 

This example

thema

+0

請注意,[只有鏈接的答案](http://meta.stackoverflow.com/tags/link-only-answers/info)不鼓勵,所以答案應該是搜索解決方案的終點(與另一個引用的中途停留時間相比,這些引用往往會隨着時間推移而變得過時)。請考慮在此添加獨立的摘要,並將鏈接保留爲參考。 – kleopatra 2013-11-21 16:52:13