linux自动读取麦克风,检测用户向麦克吹气

uid-20622737-id-1912870.html

如果几年前你告诉我人们可以通过晃动手机或向麦克吹气使手机有所动作,我一定会大笑不止。但现在这已经是事实了。

检查晃动动作是很直接的,所有这些在3.0“motion event”(动作事件)中都有介绍。

检测向麦克吹气困难一点。本教程将建立一个简单的单视图程序,它将在用户向麦克吹气时向控制台写入记录信息。

源代码/Github

可从GitHub获得。 你可以克隆软件仓库或直接下载。

概述

检测向麦克吹气的工作可分为两部分:(1) 获取麦克输入 (2) “听”吹气的声音。

我们将使用3.0中新的AVAudioRecorder类来捕获麦克输入。使用AVAudioRecorder可以让我们使用Objective-C,而不需像其他方法一样使用C。

向麦克吹气的噪声/声音是由低频声音组成的。我们将使用 来降低来自麦克的高频声音;当滤波信号的电平等级突然增大时,我们就知道有人向麦克吹气了。

创建项目

启动Xcode创建一个View-Based iPhone程序,叫MicBlow:

使用Xcode菜单File > New Project… 创建一个新项目

从 iPhone OS > Application 选择View-based Applications然后按Choose…

将项目命名为MicBlow,按Save

添加AVFoundation Framework

为使用AVAudioRecorder类,我们需要向项目添加AVFoundation framework:

在项目Groups & Files面板上展开Targets

按Control-点击或右击MicBlow

选择Add > Existing Frameworks…

按下Linked Libraries左下角的+按钮

选择AVFoundation.framework并按下Add

AVFoundation.framework出现在Linked Libraries下。关闭窗口

然后,我们在view controller接口中引入AVFoundation头文件并设置AVAudioRecorder实例变量:

展开项目Groups & Files面板下的MicBlow

展开Classes文件夹

选择MicBlowViewController.h进行编辑

更新文件。修改见如下2,3,7行:

#import

#import

#import

@interface MicBlowViewController : UIViewController

{

AVAudioRecorder *recorder;

}

@end

引入CoreAudioTypes头文件实际上是下一步需要的工作。我们还需要在设置AVAudioRecorder定义更多的常量。

获取麦克输入

我们在ViewDidLoad进行设置并开始“听“取麦克:

解除样本ViewDidLoad方法注释

更新如下。见4-18行:

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

}

AVAudioRecorder的主要功能就像前名字暗示的那样进行音频录制。其第二个功能是提供音频电平等级信息。所以,这里我们只是将音频输入指向/dev/null位 – 我没有找到任何文档支持我的观点,但一致意见是就像在任何Unix下一样,/dev/null将打开音频计量表。

注意: 如果你准备采用上述代码,记住在设置meteringEnabled属性或音频计量开始工作前,要调用prepareToRecord (或者record)。

记住在dealloc中释放recorder。 见第三行:

- (void)dealloc

{

[recorder release];

[super dealloc];

}

音频采样

我们将使用定时器每秒30次检查一次音频电平等级。NSTimer实例变量以及其回调函数在MicBlowViewController.h中定义。修改见7,10行:

#import

#import

#import

@interface MicBlowViewController : UIViewController {

AVAudioRecorder *recorder;

NSTimer *levelTimer;

}

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

@end

更新.m文件中ViewDidLoad启用定时器。修改见16,17行:

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

}

现在,我们只是直接进行音频采样而未使用滤波。在.m文件中添加levelTimerCallback:

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

[recorder updateMeters];

NSLog(@"Average input: %f Peak input: %f",

[recorder averagePowerForChannel:0], [recorder peakPowerForChannel:0]);

}

发送updateMeters消息来刷新平均和峰值功率。此计数是以对数刻度计量的,-160表示完全安静,0表示最大输入值。

不要忘记在dealloc中释放定时器。修改见第三行:

- (void)dealloc

{

[levelTimer release];

[recorder release];

[super dealloc];

}

”聆听“吹气声

正如概述中提到的那样,我们要使用低通滤波来消除高频声音对电平带来的影响。该算法建立了一系列将过去的每个采样输入合成而得到的结果。我们需要一个实例变量来保存此结果。更新.h文件。修改见第八行:

#import

#import

#import

@interface MicBlowViewController : UIViewController {

AVAudioRecorder *recorder;

NSTimer *levelTimer;

double lowPassResults;

}

替换levelTimerCallback:方法来实现此算法:

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

[recorder updateMeters];

const double ALPHA = 0.05;

double peakPowerForChannel = (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);

}

我们在每次定时器回调时重新计算一次lowPassResults变量。为方便,我们将其转换为0-1,0代表完全安静,1代表最大音量。

但低通滤波值超过一定门槛范围时,我们就可以判断有人向麦克吹了气。门槛范围值的设定是一种技巧。它设定太小,则太容易被触发,如果设定太高,则必须长时间用尽力气吹气才会有效果。在我们的程序中,我将其设为0.95。我们要改变一下log的条件,见第6,7行:

- (void)listenForBlow:(NSTimer *)timer {

[recorder updateMeters];

const double ALPHA = 0.05;

double peakPowerForChannel = (10, (0.05 * [recorder peakPowerForChannel:0]));

lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;

if (lowPassResults > 0.95)

NSLog(@"Mic blow detected");

}

好了!你可以检测是否有人吹了麦克了。

鸣谢及说明

此方法在大部分情况下工作良好,但并非任何情况都正确。我是在飞行中写的这篇文章,飞机的引擎声经常触发我的算法。类似地,在一个噪声很大的房间内足够多的低频声也会触发我的算法。

算法节选自。上面帖子使用的是库来进行音频电平检测。SCListener比AVAudioRecorder更早出现;它是用来隐藏C语言细节的获取音频电平代码。而无疑AVAudioRecorder更容易使用。

最后,此方法确实可以在模拟器中正常工作。但你要找到Mac上的麦克。出乎我的意料,第一代Macbook上的麦克处于摄像头左方的小孔中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux中端口的欺骗,Linux中的端口占用问题

本文将会阐述两种解决端口占用的方法。本文会用到的服务器端的程序如下:1 #include "unp.h"2 #include 34 int main(int argc, char **argv)5 {6 intlistenfd, connfd;7 socklen_t len;8 structsockaddr_in servaddr, cliaddr;9 charbuff[MAXLINE];10 tim…

手机内存卡转化linux,Android 往手机内存卡上存储用户名与密码的操作

当大家 用Android 应用 操作时,会发现有很多应用要登陆名和密码,而且,它们都能记住密码,当你退出 ,再次登陆时,你们帐号密码会自动添加上去。例:布局文件 相信都能做出来 就不一一介绍 了。下面…

Linux格式化sd卡博客,linux设备驱动那点事儿之SD卡驱动理论篇

一.SD/MMC卡介绍1.1.什么是MMC卡MMC:MMC就是MultiMediaCard的缩写,即多媒体卡。它是一种非易失性存储器件,体积小巧(24mm*32mm*1.4mm),容量大,耗电量低,传输速度快,广泛应用于消费类电子产品中。1.2.什么是SD卡SD&…

SQL Server 2008 数据库同步的两种方式 (发布、订阅)

通过SQL JOB的方式对数据库的同步,这一节作为上一节的延续介绍通过发布订阅的方式实现数据库之间的同步操作。发布订阅份为两个步骤:1、发布。2、订阅。首先在数据源数据库服务器上对需要同步的数据进行发布,然后在目标数据库服务器上对上述发…

前端学习(619):变量的小案例二

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><script>//请输入姓名…

【eoe特刊】第二十七期 OpenGL ES学习及项目解析

经过一个月征稿、编辑&#xff0c;新的一版特刊终于出炉了。 本次特刊的制作&#xff0c;改变以往的制作方式&#xff0c;完全取自网友的独自的风格。 在只有一个主题的前提下&#xff0c;完全是通过社区的热心的网友&#xff0c;根据自己的想法&#xff0c;自行设计&#x…

linux ubuntu技术支持电话,Ubuntu 17.04 将在1月13日结束技术支持

Canonical今天宣布&#xff0c;将在下周1月13日终止对Ubuntu 17.04 “Zesty Zapus”操作系统提供的支持。去年4月13日推出的Ubuntu 17.04是一款功能强大的内部和外部版本&#xff0c;运行最新的(当时)稳定的Linux 4.10内核系列&#xff0c;并以最新的基于Mesa 17.0和X.Org Serv…

前端学习(623):交换两个变量的值

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>交换两个变量的值</title> </head> <…

linux 漏洞数量,Debian Linux被列为过去20年漏洞数量最多的操作系统

1999 至 2019 年间&#xff0c;研究人员共发现了 Debian Linux 中的 3067 个安全漏洞。至于 Windows 平台&#xff0c;Server 2008 以 1421 个安全漏洞位列第一。Android 和 Linux 内核分别以 2563 和 2357 个漏洞排名第二和第三&#xff0c;macOS 以 2212 个漏洞排名第四。然而…

Win10 安装 MongoDB 3.6.5 失败的问题及解决方法

MongoDB 3.6.5 2008R2Plus SSL (64 bit) Setup Wizard ended prematurely 在安装 MongoDB 的时候&#xff0c;出现了MongoDB 3.6.5 2008R2Plus SSL (64 bit) Setup Wizard ended prematurely的错误&#xff0c;原因不明&#xff0c;但有解决办法&#xff1a; 解决办法 在安装…

Qt+ArcGIS Engine 10.1 开发(一)

Qt作为一个跨平台C图形用户界面应用程序开发框架&#xff0c;相当于微软的MFC(只能运行在Windows平台上)&#xff0c;Qt命运多舛&#xff0c;几经易主&#xff0c;现在属于芬兰IT服务公司Digia。 Qt环境安装 Qt的最新版本是Qt5.0,该版本是在12月中旬发布的&#xff0c;在这里我…