В моем приложении iPhone используется "AVAudioRecorder" для записи голоса. Он также использует "UIImagePickerController" для записи фильмов и "MPMoviePlayerController" для воспроизведения фильмов.
Все работает нормально, пока я не буду делать все три строки подряд:
- Записать фильм с помощью UIImagePickerController
- Воспроизведение записанного фильма с помощью MPMoviePlayerController
- Попробуйте сделать запись голоса с помощью AVAudioRecorder
Когда я вызываю метод записи "AVAudioRecorder" на шаге 3, он возвращает NO, указывающий на сбой, но не дает никаких подсказок о том, почему (приходят на Apple!). Метод передачи данных AVAudioRecorder audioRecorderEncodeErrorDidOccur никогда не вызывается и я не получаю никаких других ошибок при настройке рекордер.
Мое первое предположение заключалось в том, что запись/воспроизведение видео изменяли общий экземпляр "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!");
}
Кто-нибудь сталкивался с этой проблемой раньше?