AVAudioRecorder Record метод возвращает NO в случайное время - PullRequest
12 голосов
/ 14 марта 2012

В настоящее время я разрабатываю приложение, которое поддерживает аудиозапись в приложении. Пользователь может получить стандартный табличный вид локально сохраненных аудиофайлов, которые он / она уже записал через приложение, или нажать кнопку, чтобы перейти к новому виду записи, откуда можно записать новый аудиосеанс, который автоматически получит сохранено в изолированную программную среду приложений. Теперь эта функция работает хорошо большую часть времени. Я могу записывать новые файлы и воспроизводить их из приложения, но в случайное время аудиорекордер не сможет начать запись следующим способом:

-(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, которая проверяет, равна ли ошибка нулю или нет, поэтому на данный момент я уверен, что инициализация, похоже, не удалась. Что именно может привести к сбою метода записи в, казалось бы, случайное время, в то время как в большинстве других случаев он работает совершенно хорошо?

Ответы [ 2 ]

23 голосов
/ 14 марта 2012

Перед началом записи аудио сеанс должен быть инициализирован:

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;
}

См. Принятый ответ для справки.

0 голосов
/ 14 марта 2012

Всегда ли contentURL один и тот же или вы каждый раз генерируете новый?

Также не могли бы вы попробовать явно вызвать prepareToRecord перед записью и проверить, успешно ли он выполняется или нет?

...