Метод записи AVAudioRecorder возвращает NO в произвольное время
В настоящее время я разрабатываю приложение, которое поддерживает аудиозапись в приложении. Пользователь может получить стандартное табличное представление локально сохраненных аудиофайлов, которые он уже записал через приложение, или нажать кнопку, чтобы перейти к новому представлению записи, откуда можно записать новый аудио-сеанс, который автоматически получит сохраненный в песочнице приложений.
Теперь эта функция работает хорошо в большинстве случаев. Я могу записывать новые файлы и воспроизводить их из приложения, но случайным образом аудиозапись не сможет начать запись в этом методе:
-(void) startRecording
{
if (!isRecording)
{
isRecording = YES;
BOOL recordingSucess = [audioRecorder record];
if (recordingSucess)
NSLog(@"WE STARTED THE RECORDING!");
else
NSLog(@"WE DID NOT START THE RECORDING!");
// Start the timer
recordTiming = [NSDate date];
timeCheck = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(timeCheck) userInfo:nil repeats:YES]
}
То есть NSLog распечатает "Мы не запустили запись", указывая на то, что он не смог начать запись. Это приводит к тому, что пустой файл сохраняется в приложении с постоянным размером файла, равным 4096 байт.
Так инициализируется объект аудиорекордера:
-(id) initWithContentURL:(NSURL *)contentURL
{
self = [super init];
if (self)
{
NSLog(@"Initializing audio recorder!");
// Specific settings for the audio recording
NSDictionary *recordSettings = [NSDictionary
dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:AVAudioQualityMin],
AVEncoderAudioQualityKey,
[NSNumber numberWithInt:8],
AVEncoderBitRateKey,
[NSNumber numberWithInt: 2],
AVNumberOfChannelsKey,
[NSNumber numberWithFloat:22000.0],
AVSampleRateKey,
nil];
NSError *error = nil;
audioRecorder = [[AVAudioRecorder alloc] initWithURL:contentURL settings:recordSettings error:&error];
audioRecorder.delegate = self;
}
Существует также проверка NSLog, которая проверяет, является ли ошибка нулевой или нет, поэтому на этом этапе я уверен, что инициализация не работает.
Что именно может привести к тому, что метод записи будет терпеть неудачу в казалось бы случайные времена, в то время как он отлично работает в большинстве других случаев?
Ответы
Ответ 1
Перед началом записи звуковой сеанс должен быть инициализирован:
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
NSError *err = nil;
[audioSession setCategory :AVAudioSessionCategoryPlayAndRecord error:&err];
if(err){
NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
return;
}
err = nil;
[audioSession setActive:YES error:&err];
if(err){
NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
return;
}
См. принятый ответ для справки.
Ответ 2
Является ли contentURL всегда одинаковым или каждый раз генерирует новый?
Также вы можете попробовать явно вызвать prepareToRecord перед записью и проверить, удастся ли это или нет?