干草伙计们,我正在开发一个 Ipad 应用程序,在其中我播放 3 次哔哔声,然后检测语音。但问题是,当我第一次在阅读屏幕上开始阅读时,哔哔声很好,但麦克风剂量无法检测到声音。如果移动到另一个屏幕并再次进入阅读屏幕,那么哔哔声是完美的,麦克风也可以正常工作。播放蜂鸣音的代码如下
- (void)playAudio
{
[self setupAudioSession];
NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"beep" ofType:@"mp3"];
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:soundFilePath];
AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];
[fileURL release];
self.click = newPlayer;
[newPlayer release];
[self.click setDelegate:self];
[self.click prepareToPlay];
[self.click play];
}
- (void)setupAudioSession {
static BOOL audioSessionSetup = NO;
if (audioSessionSetup) {
return;
}
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];
UInt32 doSetProperty = 1;
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);
[[AVAudioSession sharedInstance] setActive: YES error: nil];
audioSessionSetup = YES;
}
播放哔哔声后,我调用了这个函数来检测麦克风
-(void)startrecordingAfterCountdown{
NSURL *url = [NSURL fileURLWithPath:@"/dev/null"];
[self.view setUserInteractionEnabled:true];
NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithFloat: 44100.0], AVSampleRateKey,
[NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
[NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
[NSNumber numberWithInt: AVAudioQualityMax], AVEncoderAudioQualityKey,
nil];
NSError *error;
//
// // static BOOL audioSessionSetup2 = NO;
// // if (audioSessionSetup2) {
// // //return;
// // }
// [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryRecord error: nil];
// UInt32 doSetProperty = 1;
//
// AudioSessionSetProperty kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);
//
// [[AVAudioSession sharedInstance] setActive: YES error: nil];
//
// // audioSessionSetup2 = YES;
// AVAudioSession *audioSession = [AVAudioSession sharedInstance];
// [audioSession setActive:YES error:nil];
// [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:nil];
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%@",[error description]);
}
- (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;
if (lowPassResults > 0.20){
NSLog(@"%2f",lowPassResults);
}
}
请告诉我如何解决这个问题..麦克风将首次检测到语音
为了捕获音频,在调用prepareToRecord
之前,您需要在代码中执行此操作:
NSError *error;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:&error];
请确保在进行调用后检查error
对象,以防设置类别时出错。
嘿伙计们,我刚刚通过更改代码解决了这个问题。-(void)setupaudioSession && -(void)startrecordingAfterCountdown methods.
- (void)setupAudioSession {
static BOOL audioSessionSetup = NO;
if (audioSessionSetup) {
// return;
}
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];
UInt32 doSetProperty = 1;
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);
[[AVAudioSession sharedInstance] setActive: YES error: nil];
audioSessionSetup = YES;
}
-(void)startrecordingAfterCountdown{
NSURL *url = [NSURL fileURLWithPath:@"/dev/null"];
[self.view setUserInteractionEnabled:true];
NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithFloat: 44100.0], AVSampleRateKey,
[NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
[NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
[NSNumber numberWithInt: AVAudioQualityMax], AVEncoderAudioQualityKey,
nil];
NSError *error;
// static BOOL audioSessionSetup2 = NO;
// if (audioSessionSetup2) {
// //return;
// }
// [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryRecord error: nil];
// UInt32 doSetProperty = 1;
//AudioSessionSetProperty kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);
// [[AVAudioSession sharedInstance] setActive: YES error: nil];
// audioSessionSetup2 = YES;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setActive:YES error:nil];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:nil];
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%@",[error description]);
}
}