iPhone应用程序拾取声音
我试图根据用户是否发出响亮的声音来执行特定的操作。我不想做任何语音识别或任何事情。只要简单地根据iPhone是否能听到响亮的声音来做一个动作就行了iPhone应用程序拾取声音,iphone,objective-c,ios4,iphone-sdk-3.0,Iphone,Objective C,Ios4,Iphone Sdk 3.0,我试图根据用户是否发出响亮的声音来执行特定的操作。我不想做任何语音识别或任何事情。只要简单地根据iPhone是否能听到响亮的声音来做一个动作就行了 任何建议,教程,我在苹果开发者网站上都找不到。我假设我没有正确地寻找 苹果公司有这样的例子,比如它似乎有与分贝相关的代码。我会检查一些米类的例子。我没有音频编程经验,但希望在有人给你提供更好的答案时,这会让你开始学习。最简单的方法就是使用AudioQueue服务。这是手册: 基本上,查找任何使用AudioQueueNewInput()初始化内容的示
任何建议,教程,我在苹果开发者网站上都找不到。我假设我没有正确地寻找 苹果公司有这样的例子,比如它似乎有与分贝相关的代码。我会检查一些米类的例子。我没有音频编程经验,但希望在有人给你提供更好的答案时,这会让你开始学习。最简单的方法就是使用AudioQueue服务。这是手册: 基本上,查找任何使用AudioQueueNewInput()初始化内容的示例代码。大概是这样的:
Status = AudioQueueNewInput(&_Description,
Audio_Input_Buffer_Ready,
self,
NULL,
NULL,
0,
&self->Queue);
// Turn on level metering (iOS 2.0 and later)
UInt32 on = 1;
AudioQueueSetProperty(self->Queue,kAudioQueueProperty_EnableLevelMetering,&on,sizeof(on));
//
// Check metering levels and detect silence
//
AudioQueueLevelMeterState meters[1];
UInt32 dlen = sizeof(meters);
Status = AudioQueueGetProperty(_Queue,kAudioQueueProperty_CurrentLevelMeterDB,meters,&dlen);
if (Status == 0) {
if (meters[0].mPeakPower > _threshold) {
silence = 0.0; // reset silence timer
} else {
silence += time;
}
}
//
// Notify observers of incoming data.
//
if (delegate) {
[delegate audioMeter:meters[0].mPeakPower duration:time];
[delegate audioData:Buffer->mAudioData size:Buffer->mAudioDataByteSize];
}
一旦开始,您可以通过以下方式启用声级测量:
Status = AudioQueueNewInput(&_Description,
Audio_Input_Buffer_Ready,
self,
NULL,
NULL,
0,
&self->Queue);
// Turn on level metering (iOS 2.0 and later)
UInt32 on = 1;
AudioQueueSetProperty(self->Queue,kAudioQueueProperty_EnableLevelMetering,&on,sizeof(on));
//
// Check metering levels and detect silence
//
AudioQueueLevelMeterState meters[1];
UInt32 dlen = sizeof(meters);
Status = AudioQueueGetProperty(_Queue,kAudioQueueProperty_CurrentLevelMeterDB,meters,&dlen);
if (Status == 0) {
if (meters[0].mPeakPower > _threshold) {
silence = 0.0; // reset silence timer
} else {
silence += time;
}
}
//
// Notify observers of incoming data.
//
if (delegate) {
[delegate audioMeter:meters[0].mPeakPower duration:time];
[delegate audioData:Buffer->mAudioData size:Buffer->mAudioDataByteSize];
}
您将有一个为每个音频数据块调用的回调例程。在其中,您可以通过以下方式检查当前仪表的液位:
Status = AudioQueueNewInput(&_Description,
Audio_Input_Buffer_Ready,
self,
NULL,
NULL,
0,
&self->Queue);
// Turn on level metering (iOS 2.0 and later)
UInt32 on = 1;
AudioQueueSetProperty(self->Queue,kAudioQueueProperty_EnableLevelMetering,&on,sizeof(on));
//
// Check metering levels and detect silence
//
AudioQueueLevelMeterState meters[1];
UInt32 dlen = sizeof(meters);
Status = AudioQueueGetProperty(_Queue,kAudioQueueProperty_CurrentLevelMeterDB,meters,&dlen);
if (Status == 0) {
if (meters[0].mPeakPower > _threshold) {
silence = 0.0; // reset silence timer
} else {
silence += time;
}
}
//
// Notify observers of incoming data.
//
if (delegate) {
[delegate audioMeter:meters[0].mPeakPower duration:time];
[delegate audioData:Buffer->mAudioData size:Buffer->mAudioDataByteSize];
}
或者,在您的情况下,您可以检测分贝水平是否超过某个值足够长的时间,而不是保持沉默。请注意,您将看到的分贝值范围从死寂的-70.0左右,到非常响亮的声音的0.0db。以指数级的规模。您必须使用它来查看哪些值适用于您的特定应用程序。谢谢,这将对我有很大帮助。嗨@Joe。我可以在我的项目中使用Speak吗?嘿@GajendraKChauhan,IANAL,所以我会让你参考中的免责声明。如果你有问题,请咨询律师:)我希望我能帮上更多的忙。