Вопрос

Я пытаюсь настроить базовый контроллер, который будет записывать пользовательский аудиовход (голос). Однако метод prepareToRecord в AVAudioRecorder не работает, и я не могу понять, почему. Я настроил аудио сеанс в моем делегате приложения, и я не получаю сообщения об ошибках при создании экземпляра экземпляра AVAudioRecorder:

// Фрагмент делегата приложения

AVAudioSession* audioSession = [AVAudioSession sharedInstance];
NSError* audioSessionError   = nil;

[audioSession setCategory: AVAudioSessionCategoryPlayAndRecord
                  error: &audioSessionError];

  if (audioSessionError) {
    NSLog (@"Error setting audio category: %@", [audioSessionError localizedDescription]); 
} else {
  NSLog(@"No session errors for setting category");
}

[audioSession setActive:YES error:&audioSessionError];

if (audioSessionError) {
  NSLog (@"Error activating audio session: %@", [audioSessionError localizedDescription]); 
} else {
NSLog(@"no session errors for setActive");
}

// ПРОСМОТРЕТЬ ЗАГРУЗКУ В RECORDERCONTROLLER

- (void)viewDidLoad {

self.navigationItem.title = [NSString stringWithFormat:@"%@", [[MyAppDelegate loadApplicationPlist] valueForKey:@"recorderViewTitle"]];

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone 
                                                                                     target:self 
                                                                                     action:@selector(dismiss)];

[self alertIfNoAudioInput];

 [self createAVAudioRecorder];

 minutesSecondsFormatter = [[SimpleMinutesSecondsFormatter alloc] init];
currentTimeUpdateTimer  = [NSTimer scheduledTimerWithTimeInterval:0.1
                                                        target:self selector:@selector(updateAudioDisplay)
                                                       userInfo:NULL repeats:YES];

[super viewDidLoad];
}

// CREATE AVAUDIORECORDER

- (NSError *)createAVAudioRecorder {

NSError *recorderSetupError = nil;

 [audioRecorder release];
audioRecorder = nil;

 NSString *timestamp = [NSString stringWithFormat:@"%d", (long)[[NSDate date] timeIntervalSince1970]];

 NSString *destinationString = [[MyAppDelegate getAppDocumentsDirectory] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.caf", timestamp]];
 NSLog(@"destinationString: %@", destinationString);
 NSURL *destinationUrl       = [NSURL fileURLWithPath: destinationString];

 audioRecorder = [[AVAudioRecorder alloc] initWithURL:destinationUrl 
                                          settings:[[AVRecordSettings sharedInstance] getSettings] 
                                             error:&recorderSetupError];

if (recorderSetupError) {

   UIAlertView *cantRecordAlert =
    [[UIAlertView alloc] initWithTitle:@"Can't record"
                           message:[recorderSetupError localizedDescription]
                          delegate:nil
                 cancelButtonTitle:@"OK"
                 otherButtonTitles:nil];
    [cantRecordAlert show];
    [cantRecordAlert release];
    return recorderSetupError;
} else {
  NSLog(@"no av setup error");
}

if ([audioRecorder prepareToRecord]) {
  recordPauseButton.enabled = YES;
  audioRecorder.delegate    = self;
 } else {
  NSLog(@"couldn't prepare to record");
 }

 NSLog (@"recorderSetupError: %@", recorderSetupError);

 return recorderSetupError;
 }
Это было полезно?

Решение

Это происходит сбой, поскольку вы не инициализировали объект AVAudioRecorder с использованием правильных настроек. Сделайте это перед его инициализацией:

    NSDictionary *recordSettings =
    [[NSDictionary alloc] initWithObjectsAndKeys:
     [NSNumber numberWithFloat: 44100.0],                 AVSampleRateKey,
     [NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
     [NSNumber numberWithInt: 1],                         AVNumberOfChannelsKey,
     [NSNumber numberWithInt: AVAudioQualityMax],         AVEncoderAudioQualityKey,
     nil];

тогда вы можете создать его экземпляр с помощью

audioRecorder = [[AVAudioRecorder alloc] initWithURL:destinationUrl 
                                          settings:recordSettings
                                             error:&recorderSetupError];

Другие советы

prepareToRecord также завершается с ошибкой (молча, без ошибок), если каталог, в котором вы пытаетесь сохранить файл, не существует. Используйте NSFileManager, чтобы проверить, существует ли каталог.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top