是否有可能(實時)檢測到有人在吹麥克風? 感謝Android麥克風問題
回答
是的,
您可以使用AudioRecord類和分析回來的波形。
編輯:只做了一些研究 - 一個告誡。事實證明,Android不能很好地處理音頻處理。你會看到100ms的延遲。如果你的項目沒有問題(可能它聽起來像)很好,但只是需要注意的一點。
添加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。
- 1. Android內部麥克風發佈問題
- 2. Lync 2013麥克風問題
- 3. 沒有麥克風? SpeechRecognitionEngine SetInputToDefaultAudioDevice()問題
- 4. AudioKit問題,麥克風不夠敏感
- 5. Google Chrome麥克風問題OpenVBX
- 6. 後臺Android中的麥克風訪問
- 7. 獨家訪問Android中的麥克風
- 8. 在Android SDK中訪問麥克風
- 9. 的Android流麥克風
- 10. Trigger.io麥克風訪問
- 11. 訪問移動麥克風
- 12. Loudtalks麥克風
- 13. 在Android中錄製麥克風的wav文件 - 問題
- 14. Windows假麥克風
- 15. 麥克風輸入
- 16. 麥克風到Airplay
- 17. AS3:從麥克風
- 18. AudioRecorder塊麥克風
- 19. Kindle fire,麥克風
- 20. 麥克風輸入
- 21. 麥克風輸入
- 22. 使用java的麥克風上的麥克風聲級控制
- 23. 將耳機麥克風更換爲內置麥克風
- 24. 麥克風插入事件/麥克風附加事件Vista
- 25. 檢測打擊在Android的麥克風
- 26. Android force AudioRecord使用耳機麥克風
- 27. Android音頻流和麥克風
- 28. 在android中禁用麥克風
- 29. 帶麥克風的Android哨音檢測
- 30. 如何在Android上使用麥克風
請注意,[只有鏈接的答案](http://meta.stackoverflow.com/tags/link-only-answers/info)不鼓勵,所以答案應該是搜索解決方案的終點(與另一個引用的中途停留時間相比,這些引用往往會隨着時間推移而變得過時)。請考慮在此添加獨立的摘要,並將鏈接保留爲參考。 – kleopatra 2013-11-21 16:52:13