2012-04-03 2 views
3

У меня возникла проблема с AVAudioRecorder, которая не работает для меня, по крайней мере, из того, что я вижу (или не слышу).iOS - Запись звука с ошибкой AVAudioRecorder без ошибок

Я ориентируюсь на iOS 5 с ARC.

Я установил объекты ошибки, но ни один из них не уволен, поэтому я думаю, что я делаю что-то неправильно здесь.

Вот часть были насторить AVAudioRecorder:

NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *docsDir = [dirPaths objectAtIndex:0]; 
NSString *soundFilePath = [docsDir stringByAppendingPathComponent:currentTrack.trackFileName]; 

currentTrack.trackFileURL = [NSURL fileURLWithPath:soundFilePath]; 

NSLog(@"Chemin : %@", currentTrack.trackFileURL.path); 

NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init]; 

[recordSetting setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey]; 
[recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; 
[recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey]; 

[recordSetting setValue :[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey]; 
[recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey]; 
[recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey]; 


currentTrack.trackRecordSettings = recordSetting; 


NSError *err = nil; 


//[audioSession setDelegate:self]; 
if(err){ 
    NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]); 
    return; 
} 
[[AVAudioSession sharedInstance] setActive:YES error:&err]; 
err = nil; 
if(err){ 
    NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]); 
    return; 
} 
err = nil; 
recorder = [[AVAudioRecorder alloc] 
       initWithURL:currentTrack.trackFileURL 
       settings:currentTrack.trackRecordSettings 
       error:&error]; 

if (err) 
{ 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"Warning" 
           message: [err localizedDescription] 
           delegate: nil 
        cancelButtonTitle:@"OK" 
        otherButtonTitles:nil]; 
    [alert show]; 
    NSLog(@"error: %@", [error localizedDescription]); 

} else { 
    [recorder setDelegate:self]; 
    [recorder prepareToRecord]; 

    BOOL audioHWAvailable = [[AVAudioSession sharedInstance]inputIsAvailable ]; 
    if (!audioHWAvailable) { 
     UIAlertView *cantRecordAlert = 
     [[UIAlertView alloc] initWithTitle: @"Warning" 
            message: @"Audio input hardware not available" 
            delegate: nil 
         cancelButtonTitle:@"OK" 
         otherButtonTitles:nil]; 
     [cantRecordAlert show]; 
     return; 
    } 
} 

Нет ошибок брошено здесь

Тогда, когда пришло время, чтобы начать запись:

-(void)startRecordingAudio{ 
    NSLog(@"Start recording"); 
    [[AVAudioSession sharedInstance] setCategory :AVAudioSessionCategoryRecord error:nil]; 
    [recorder record]; 
} 

Тогда, когда это время прекращения записи:

-(void)stopRecordingAudio{ 
    NSLog(@"Stop recording"); 
    [recorder stop]; 
    NSError *err; 
    NSData *audioData = [NSData dataWithContentsOfFile:currentTrack.trackFileURL.path options: 0 error:&err]; 
    if(!audioData) 
     NSLog(@"audio data error: %@ %d %@", [err domain], [err code], [[err userInfo] description]); 
    NSLog(@"%d", audioData.length); 
    } 

Нормально ли, что длина аудиоданных всегда 4096? Если я понимаю, право это около 93 мс звука ...

Наконец, когда пришло время для воспроизведения записанного звука:

-(void)startPlayingAudio{ 
    [[AVAudioSession sharedInstance] setCategory :AVAudioSessionCategoryPlayback error:nil]; 

    NSLog(@"Start playing"); 
    NSError *error; 
    if(player == nil){ 
     player = [[AVAudioPlayer alloc] initWithContentsOfURL:currentTrack.trackFileURL  
     error:&error];                   
    } 


    player.delegate = self; 

    if (error) 
     NSLog(@"Error: %@", 
       [error localizedDescription]); 
    else 
     [player play]; 
} 

Я сделал методы установки делегата, который никогда не сгореть тоже:

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 
{ 
    NSLog (@"audioRecorderDidFinishRecording:successfully:"); 
} 
-(void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error 
{ 
    NSLog(@"Decode Error occurred"); 
} 
-(void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully: (BOOL)flag 
{ 
    NSLog (@"audioRecorderDidFinishRecording:successfully: %d", flag); 
} 
-(void)audioRecorderEncodeErrorDidOccur:(AVAudioRecorder *)recorder error:(NSError *)error 
{ 
    NSLog(@"Encode Error occurred"); 
} 
-(void)beginInterruption{ 
    NSLog(@"INTERRUPT"); 
} 

Кроме того, я видел, что .caf-файл создан правильно в папке документа приложения.

Спасибо за любую помощь, которую вы можете принести. На данный момент я не слышу звук, записанный, и я тестирую устройство iPhone 4 без наушников.

ответ

0

У вас проблема: Запись была вызвана раньше, чем подготовитьРекорд. Поскольку я использовал viewDidAppear для настройки записи, вызов для начала записи был сделан до того, как вид был виден ...

Я использовал viewDidAppear, потому что viewDidLoad не вызывается, так как я не использую initWithNib. Я попытался переопределить loadView, но все примеры, которые я нашел, не так понятны в отношении объекта, и loadView никогда не вызывается. Может быть, кто-то может указать мне в правильном направлении? Тем не менее, я могу слышать голос на iphone!

Спасибо за ваше время.

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