2010-11-25 6 views

Répondre

10

Voici un exemple de code alternatif qui encoder le fichier en tant que AAC dans un m4a:

NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *docsDir = [dirPaths objectAtIndex:0]; 
NSURL *tmpFileUrl = [NSURL fileURLWithPath:[docsDir stringByAppendingPathComponent:@"tmp.m4a"]]; 
NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey, 
         [NSNumber numberWithFloat:16000.0], AVSampleRateKey, 
         [NSNumber numberWithInt: 1], AVNumberOfChannelsKey, 
         nil]; 
NSError *error = nil; 
AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:tmpFileUrl settings:recordSettings error:&error]; 
[recorder prepareToRecord]; 

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

[recorder record]; 

Puis pour terminer l'enregistrement je:

[recorder stop]; 
AVAudioSession *session = [AVAudioSession sharedInstance]; 
int flags = AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation; 
[session setActive:NO withFlags:flags error:nil]; 

ensuite le fichier à 'tmpFileUrl' peut être utilisé.

+0

Vous pouvez attendre que 'audioRecorderDidFinishRecording: aboutit à:' pour savoir si le fichier est valide. – alltom

+1

Génial, cela a fonctionné parfaitement pour l'enregistrement directement sur * m4a sans avoir à convertir plus tard. Vous devez utiliser AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation au lieu de AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation, car il est obsolète depuis la version 4.0 (fonctionne toujours, mais juste au cas où). – DZenBot

+0

Quelqu'un at-il un exemple d'application que je peux exécuter pour voir ce code en action? J'allais le brancher dans l'exemple d'application Recorder dans les doc du centre de développement iOS, mais c'est un peu complexe pour moi. Merci! –

3

Voici le code SWIFT de travail pour enregistrer les fichiers audio m4a. Gardez à l'esprit que frapper le bon format paframeters qui produisent des fichiers audio utilisables dans iOS est vraiment pénible à trouver. J'ai trouvé cette combinaison après beaucoup d'essais et d'erreurs. J'espère que cela vous fait gagner du temps, profitez-en!

let recordSettings: [String : AnyObject] = [AVSampleRateKey : NSNumber(float: Float(16000)), 
               AVFormatIDKey : NSNumber(int: Int32(kAudioFormatMPEG4AAC)), 
     AVNumberOfChannelsKey : NSNumber(int: 1), 
     AVEncoderAudioQualityKey : NSNumber(int: Int32(AVAudioQuality.Low.rawValue))] 

func initializeAudioSession(){ 


    let audioSession = AVAudioSession.sharedInstance() 
    do { 
     try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord) 
     try audioRecorder = AVAudioRecorder(URL: self.directoryURL()!, 
              settings: recordSettings) 
     audioRecorder.delegate = self 
     audioRecorder.meteringEnabled = true 
     audioRecorder.prepareToRecord() 
    } catch let error as NSError{ 
     print("ERROR Initializing the AudioRecorder - "+error.description) 
    } 
} 

func recordSpeechM4A(){ 
     if !audioRecorder.recording { 
      let audioSession = AVAudioSession.sharedInstance() 
      do { 
       try audioSession.setActive(true) 
       audioRecorder.record() 
       print("RECORDING") 
      } catch { 
      } 
     } 
    } 

func directoryURL() -> NSURL { //filename helper method 
     let fileManager = NSFileManager.defaultManager() 
     let urls = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) 
     filepath = urls[0] 
     let documentDirectory = urls[0] as NSURL 
     print("STORAGE DIR: "+documentDirectory.description) 
     //print("---filepath: "+(filepath?.description)!) 
     let soundURL = documentDirectory.URLByAppendingPathComponent("recordedAudio.m4a") //.m4a 
     print("SAVING FILE: "+soundURL.description) 
     return soundURL 
    } 
+0

Dans quel format sauvegardez-vous l'enregistrement? .caf? .m4a? ce n'est pas clair à partir de votre extrait. – Josh

+0

@Josh Le snippet enregistre au format m4a, qui est défini à 2 endroits: 1) dans le paramètre kAudioFormatMPEG4AAC 'recordSettings' et 2) en tant qu'extension explicite .m4a qui provient de self.directoryURL(). J'ai ajouté le code de directoryURL() à la réponse pour que vous puissiez voir d'où il vient. Important: Pour une raison quelconque, la plupart des combinaisons de paramètres d'enregistrement AVSampleRateKey et AVFormatIDKey se bloquent, vous serez donc limité à ceux qui fonctionnent (j'ai découvert par essais et erreurs) – Josh

Questions connexes