AVAudioRecorder не записывает, если фильм был ранее записан и воспроизведен

В моем приложении для iPhone для записи голоса используется программа «AVAudioRecorder». Он также использует «UIImagePickerController» для записи фильмов и «MPMoviePlayerController» для воспроизведения фильмов.

Все работает нормально, пока я не сделаю все три вещи подряд:

  1. Записать фильм с помощью UIImagePickerController
  2. Воспроизвести записанный фильм с помощью MPMoviePlayerController
  3. Попытаться сделать запись голоса с помощью AVAudioRecorder

Когда я вызвать "запись" AVAudioRecorder на шаге 3 он возвращает NO, указывая на сбой, но не дает никаких подсказок относительно того, почему (давай, Apple!) Метод делегата audioRecorderEncodeErrorDidOccur AVAudioRecorder никогда не вызывается, и я не получаю никаких других ошибок при настройке записывающего устройства.

Мое первое предположение было что при записи / воспроизведении фильма был изменен общий экземпляр «AVAudioSession» таким образом, что это препятствовало работе устройства записи звука. Однако я вручную устанавливаю для свойства категории AVAudioSession значение «AVAudioSessionCategoryRecord» и делаю аудиосеанс активным перед попыткой записи.

Вот мой метод создания записывающего устройства:

- (void)createAudioRecorder
{
 NSError *error = nil;
 AVAudioSession *audioSession = [AVAudioSession sharedInstance];
 [audioSession setCategory:AVAudioSessionCategoryRecord error:&error];
 if (error)
  ...
 [audioSession setActive:YES error:&error];
 if (error)
  ...

 NSMutableDictionary *settings = [[NSMutableDictionary alloc] init];

 // General Audio Format Settings 
 [settings setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
 [settings setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; 
 [settings setValue:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey];

 // Encoder Settings 
 [settings setValue:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityKey]; 
 [settings setValue:[NSNumber numberWithInt:96] forKey:AVEncoderBitRateKey]; 
 [settings setValue:[NSNumber numberWithInt:16] forKey:AVEncoderBitDepthHintKey];

 // Write the audio to a temporary file
 NSURL *tempURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:@"Recording.m4a"]];

 audioRecorder = [[AVAudioRecorder alloc] initWithURL:tempURL settings:settings error:&error];
 if (error)
  ...

 audioRecorder.delegate = self;
 if ([audioRecorder prepareToRecord] == NO)
  NSLog(@"Recorder fails to prepare!");

 [settings release];
}

И вот мой способ начать запись:

- (void)startRecording
{
 if (!audioRecorder)
  [self createAudioRecorder];

 NSError *error = nil;
 [[AVAudioSession sharedInstance] setActive:YES error:&error];
 if (error)
  ...

 BOOL recording = [audioRecorder record];
 if (!recording)
  NSLog(@"Recording won't start!");
}

] Кто-нибудь сталкивался с этой проблемой раньше?

10
задан Roberto 10 November 2010 в 19:13
поделиться