iPhone应用程序拾取声音

iPhone应用程序拾取声音,iphone,objective-c,ios4,iphone-sdk-3.0,Iphone,Objective C,Ios4,Iphone Sdk 3.0,我试图根据用户是否发出响亮的声音来执行特定的操作。我不想做任何语音识别或任何事情。只要简单地根据iPhone是否能听到响亮的声音来做一个动作就行了 任何建议,教程,我在苹果开发者网站上都找不到。我假设我没有正确地寻找 苹果公司有这样的例子,比如它似乎有与分贝相关的代码。我会检查一些米类的例子。我没有音频编程经验,但希望在有人给你提供更好的答案时,这会让你开始学习。最简单的方法就是使用AudioQueue服务。这是手册: 基本上,查找任何使用AudioQueueNewInput()初始化内容的示

我试图根据用户是否发出响亮的声音来执行特定的操作。我不想做任何语音识别或任何事情。只要简单地根据iPhone是否能听到响亮的声音来做一个动作就行了


任何建议,教程,我在苹果开发者网站上都找不到。我假设我没有正确地寻找

苹果公司有这样的例子,比如它似乎有与分贝相关的代码。我会检查一些米类的例子。我没有音频编程经验,但希望在有人给你提供更好的答案时,这会让你开始学习。

最简单的方法就是使用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,所以我会让你参考中的免责声明。如果你有问题,请咨询律师:)我希望我能帮上更多的忙。