2015-09-30 4 views
0

Вот код, который я использую для запуска записи. Может ли кто-нибудь предложить решение?AVAudioRecorder prepareToRecord всегда возвращает NO

[AVAudioRecorder prepareToRecord] всегда не возвращают

AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
[audioSession setCategory:AVAudioSessionCategoryRecord error:nil]; 

NSMutableDictionary *recordSettings = [[NSMutableDictionary alloc] initWithCapacity:10]; 
if(recordEncoding == ENC_PCM) 
{ 
    [recordSettings setObject:[NSNumber numberWithInt: kAudioFormatLinearPCM] forKey: AVFormatIDKey]; 
    [recordSettings setObject:[NSNumber numberWithFloat:44100.0] forKey: AVSampleRateKey]; 
    [recordSettings setObject:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey]; 
    [recordSettings setObject:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey]; 
    [recordSettings setObject:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey]; 
    [recordSettings setObject:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey]; 
} 
else 
{ 
    NSNumber *formatObject; 

    switch (recordEncoding) { 
     case (ENC_AAC): 
      formatObject = [NSNumber numberWithInt: kAudioFormatMPEG4AAC]; 
      break; 
     case (ENC_ALAC): 
      formatObject = [NSNumber numberWithInt: kAudioFormatAppleLossless]; 
      break; 
     case (ENC_IMA4): 
      formatObject = [NSNumber numberWithInt: kAudioFormatAppleIMA4]; 
      break; 
     case (ENC_ILBC): 
      formatObject = [NSNumber numberWithInt: kAudioFormatiLBC]; 
      break; 
     case (ENC_ULAW): 
      formatObject = [NSNumber numberWithInt: kAudioFormatULaw]; 
      break; 
     default: 
      formatObject = [NSNumber numberWithInt: kAudioFormatAppleIMA4]; 
    } 

    [recordSettings setObject:formatObject forKey: AVFormatIDKey]; 
    [recordSettings setObject:[NSNumber numberWithFloat:44100.0] forKey: AVSampleRateKey]; 
    [recordSettings setObject:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey]; 
    [recordSettings setObject:[NSNumber numberWithInt:12800] forKey:AVEncoderBitRateKey]; 
    [recordSettings setObject:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey]; 
    [recordSettings setObject:[NSNumber numberWithInt: AVAudioQualityHigh] forKey: AVEncoderAudioQualityKey]; 
} 

NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/recordTest.caf", [[NSBundle mainBundle] resourcePath]]]; 

NSError *error = nil; 
audioRecorder = [[ AVAudioRecorder alloc] initWithURL:url settings:recordSettings error:&error]; 

BOOL canRecord = [audioRecorder prepareToRecord]; 
if ([audioRecorder prepareToRecord] == YES){ 
    [audioRecorder record]; 
}else { 
    int errorCode = CFSwapInt32HostToBig ([error code]); 
    NSLog(@"Error: %@ [%4.4s])" , [error localizedDescription], (char*)&errorCode); 
} 
+1

1) Вы можете проверить, что 'audioRecorder' не ноль? 2) Вы дважды вызываете «prepareToRecord». – Aderstedt

+0

На самом деле, я проверяю возврат значения bool на prepareToRecord. Думаю, это не имеет большого значения. –

+0

Можете ли вы рассказать о различии между 'audioRecorder'' 'nil' и' prepareToRecord', возвращающим 'NO'? – Aderstedt

ответ

2

Вам нужно активировать AVAudioSession:

[audioSession setActive:YES error:&error]; 

 Смежные вопросы

  • Нет связанных вопросов^_^