2014-04-25 2 views
3

У меня проблема с AVFoundation framework. мое приложение готово в старой версии, а затем я обновляю ios 7, на этот раз мой аудиомагнитофон работает на симуляторе, но не работает на iphone. так что кто-нибудь поможет мне, что является реальной проблемой.Аудиозапись не работает в iphone с ios 7

мой код это

-(IBAction)startRecording 
{ 
    btnRecord.showsTouchWhenHighlighted = YES; 
    btnRecord.enabled = NO; 
    btnPlay.enabled = NO; 
    btnStop.enabled = YES; 
    btnPause.enabled = YES; 
    btnDelete.enabled = NO; 
    if(!flagPause) 
    { 
     NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
     [dateFormat setDateFormat:@"yyyy-MM-dd"]; 

     NSDateFormatter *timeFormat = [[NSDateFormatter alloc] init]; 
     [timeFormat setDateFormat:@"HH.mm.SS"]; 

     NSDate *now = [[NSDate alloc] init]; 

     theDate = [dateFormat stringFromDate:now]; 
     theTime = [timeFormat stringFromDate:now]; 


     NSString *filename =[NSString stringWithFormat:@"|%@|%@|",theDate,theTime]; 
     theDate=[[NSString alloc]initWithString:filename]; 


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

     ***** i try this one but not working 
     //[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; 
     //[audioSession setActive:YES 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]; 

      //**************** I try this one ***********************>>>> 
      //[recordSettings setObject:[NSNumber numberWithInt:12800] forKey:AVEncoderBitRateKey]; 

      [recordSettings setObject:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey]; 

      [recordSettings setObject:[NSNumber numberWithInt: AVAudioQualityHigh] forKey: AVEncoderAudioQualityKey]; 
     } 
     NSURL *url; 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder 
     NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"Recording"]; 
     if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath]) 
      [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:nil]; 

     NSString *filePath =[NSString stringWithFormat:@"%@/%@.caf",dataPath,theDate]; 
     // appiPhone.strATitle = theDate; 
     url = [NSURL fileURLWithPath:filePath]; 
     NSError *error = nil; 

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

     if ([audioRecorder prepareToRecord] == YES) 
     { 
      [audioRecorder record]; 
     } 
     else 
     { 
      //int errorCode = CFSwapInt32HostToBig ([error code]); 
      // NSLog(@"Error: %@ [%4.4s])" , [error localizedDescription], (char*)&errorCode);  
     } 
    } 
    else 
    { 
     [audioRecorder record]; 
     flagPause = NO; 
    } 
    //appiPhone.intBtnAnsTag = 1; 
} 
+0

Это не ответ на этот вопрос, но согласно моим наблюдениям, вы установили AVNumberOfChannelsKey на 2. Вы можете уточнить его необходимость? В противном случае его ОК, чтобы сохранить его 1. Это увеличит качество записи. – Yogi

+0

вы не можете слушать звуки, но, вероятно, это записи. Если он работает на симуляторе, попробуйте прослушать, когда вы воспроизводите записанный звук на динамик динамика iphone. –

+0

. Одна из отличий между 6 и 7 заключается в том, что разрешение требуется для доступа Микрофон. Убедитесь, что вы предоставили разрешение на приложение. Посмотрите в настройках-> Конфиденциальность-> Микрофон – MDB983

ответ

0

Недавно я разработал очень простой игры и записи демо (буквально только 3 кнопки делать то, что вы ожидаете). У меня изначально была та же проблема: она работала бы в симуляторе iOS, но не на моем устройстве. Сначала я должен был убедиться, что приложение было разрешения на использование микрофона, перейдя в настройки -> Конфиденциальность -> микрофон

Я также должен был имела следующий код перед установкой моего аудио-рекордера

AVAudioSession *session = [AVAudioSession sharedInstance]; 
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; 
[session setActive:YES error:nil]; 

Ниже это весь код моей простой простой демонстрации. AudioPlayer и AudioRecorder называются в заголовочных

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    AVAudioSession *session = [AVAudioSession sharedInstance]; 
    [session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; 
    [session setActive:YES error:nil]; 
    NSDictionary *audioSettings = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:44100],AVSampleRateKey,[NSNumber numberWithInt:kAudioFormatAppleLossless], AVFormatIDKey, [NSNumber numberWithInt:1],AVNumberOfChannelsKey, [NSNumber numberWithInt:AVAudioQualityMedium], AVEncoderAudioQualityKey, nil]; 

    NSURL *audioFileURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingString:@"audioRecording.m4a"]]; 

    self.audioRecorder = [[AVAudioRecorder alloc]initWithURL:audioFileURL settings:audioSettings error:nil]; 

    [super viewDidLoad]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (IBAction)audioRecord:(id)sender { 

    [self.audioRecorder record]; 
} 

- (IBAction)audioStop:(id)sender { 
    [self.audioPlayer stop]; 
    [self.audioRecorder stop]; 

    NSURL *audioFileURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingString:@"audioRecording.m4a"]]; 
    self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:audioFileURL error:nil]; 
} 

- (IBAction)audioPlay:(id)sender { 

    [self.audioPlayer play]; 
} 
@end 
Смежные вопросы