2014-04-27 4 views
2

J'ai donc le code actuel:Quels sont les meilleurs paramètres d'enregistrement de microphone pour AVAudio?

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    //for recording audio 
    _stopButton.enabled = NO; 
    _playButton.hidden = true; 

    NSArray *dirPaths; 
    NSString *docsDir; 

    dirPaths = NSSearchPathForDirectoriesInDomains(
                NSDocumentDirectory, NSUserDomainMask, YES); 
    docsDir = dirPaths[0]; 

    NSString *soundFilePath = [docsDir 
           stringByAppendingPathComponent:@"recording.caf"]; 

    NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath]; 

    NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
            [NSNumber numberWithInt:kAudioFormatMPEG4AAC], AVFormatIDKey, 
            [NSNumber numberWithFloat:44100.0], AVSampleRateKey, 
            [NSNumber numberWithInt:1], AVNumberOfChannelsKey, 
            [NSNumber numberWithInt:AVAudioQualityHigh], AVSampleRateConverterAudioQualityKey, 
            [NSNumber numberWithInt:128000], AVEncoderBitRateKey, 
            [NSNumber numberWithInt:16], AVEncoderBitDepthHintKey, 
            nil]; 

    NSError *error = nil; 

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

    _audioRecorder = [[AVAudioRecorder alloc] 
         initWithURL:soundFileURL 
         settings:recordSettings 
         error:&error]; 

    if (error) 
    { 
     NSLog(@"error: %@", [error localizedDescription]); 
    } else { 
     [_audioRecorder prepareToRecord]; 
    } 
    //---------------------------- 
    //end 

} 

Et le joueur:

- (IBAction)playAudio:(id)sender { 
    [_playButton setEnabled:NO]; 
    if (!_audioRecorder.recording) 
    { 
     _stopButton.enabled = YES; 
     _recordButton.enabled = NO; 

     NSError *error; 

     _audioPlayer = [[AVAudioPlayer alloc] 
         initWithContentsOfURL:_audioRecorder.url 
         error:&error]; 
     _audioPlayer.volume = 5; 
     _audioPlayer.delegate = self; 

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

Je le _audioPlayer.volume à 5 parce que tout vous baissez pouvez à peine ici il. Mais ça sonne et sonne extrêmement déformé à ce volume. Pourquoi ne peut-il pas ressembler à des "mémos vocaux" où il est reproduit à un volume raisonnable sans qu'il ne se déforme?

Quels sont les meilleurs paramètres de qualité pour cela?

+0

Dans 'AVAudioPlayer.h':' @property volume flottant;/* Le volume pour le son. La plage nominale va de 0,0 à 1,0. */' –

Répondre

1

Personnellement, je préfère l'encodage PCM, j'ai eu une meilleure qualité en l'utilisant.

essayer:

NSDictionary *recordSettings = 
[NSDictionary dictionaryWithObjectsAndKeys: 
[NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey, 
[NSNumber numberWithFloat:44100.0], AVSampleRateKey, 
[NSNumber numberWithInt:2], AVNumberOfChannelsKey, 
[NSNumber numberWithInt:16], AVLinearPCMBitDepthKey, 
[NSNumber numberWithBool:NO], AVLinearPCMIsBigEndianKey, 
[NSNumber numberWithBool:NO], AVLinearPCMIsFloatKey, 
nil]; 

ou pour le rendre plus lisible:

NSDictionary * recordSetting; 
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]; 

Ajustez votre fonction comme ceci:

- (IBAction)playAudio:(id)sender { 
    [_playButton setEnabled:NO]; 
    if (!_audioRecorder.recording) 
    { 
     _stopButton.enabled = YES; 
     _recordButton.enabled = NO; 

     //force the session to play to come out of speakers! 
     UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; 
     AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory); 
     UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
     AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride); 

     NSError *error; 

     _audioPlayer = [[AVAudioPlayer alloc] 
         initWithContentsOfURL:_audioRecorder.url 
         error:&error]; 
     _audioPlayer.delegate = self; 
     [_audioPlayer prepareToPlay]; 

     if (error) 
      NSLog(@"Error: %@", 
        [error localizedDescription]); 
     else 
      [_audioPlayer play]; 
    }else{ 
     NSLog(@"errormax"); 
    } 
} 
+0

Merci beaucoup. La lecture est encore très calme si @meda – maxisme

+0

oh donc le problème est de jouer le son, pas le recoring? @Maximilian – meda

+0

oui. Je pensais que c'était dû à la qualité de l'enregistrement. Mais cela semble être lié au '_audioPlayer.volume'? – maxisme

1

Il est à cause de la catégorie de la session audio "AVAudioSessionCategoryPlayAndRecord". Il lit toujours l'audio dans le récepteur sauf si vous modifiez explicitement le overrideOutputAudioPort. Vous devrez peut-être ajouter un écouteur pour AVAudioSessionRouteChangeNotification pour changer la catégorie en fonction de votre sortie. Quoi qu'il en soit pourquoi ce mal de tête, il suffit d'utiliser AVAudioSessionCategoryRecord avant de commencer l'enregistrement et AVAudioSessionCategoryPlayback avant de démarrer le lecteur.

// Joueur

newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil]; 

NSError *setCategoryError = nil; 
[audioSession setCategory: AVAudioSessionCategoryPlayback error: &setCategoryError]; 

// Enregistreur

newRecorder = [[AVAudioRecorder alloc]initWithURL:fileURL settings:recordSettings error:&error]; 

NSError *setCategoryError = nil; 
[audioSession setCategory: AVAudioSessionCategoryRecord error: &setCategoryError]; 
+0

merci. Ça marche. :) – Tulon

Questions connexes