2010-11-25 5 views

Antwort

10

Hier ist ein alternatives Codebeispiel, das die Datei als AAC innerhalb eines m4a kodieren:

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]; 

Dann beenden die Aufnahme, die ich verwenden:

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

Dann wird die Datei auf 'tmpFileUrl' sein kann benutzt.

+0

Sie können warten auf 'audioRecorderDidFinishRecording: erfolgreich:' zu wissen, ob die Datei gültig ist. – alltom

+1

Großartig, das hat perfekt für die Aufnahme direkt in * m4a funktioniert, ohne später konvertieren zu müssen. Sie sollten AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation anstelle von AVAudioSessionSectiveFlags_NotifyOthersOnDeactivation verwenden, da es seit 4.0 veraltet ist (funktioniert immer noch, aber nur für den Fall). – DZenBot

+0

Hat jemand eine Beispielanwendung, die ich ausführen kann, um diesen Code in Aktion zu sehen? Ich wollte es in die Beispiel-Recorder-App in den iOS-Dev-Center-Dokumenten stecken, aber das ist etwas komplex für mich. Vielen Dank! –

3

Hier ist der funktionierende SWIFT-Code, um m4a Audiodateien aufzunehmen. Denken Sie daran, dass die richtigen Formatparameter, die in iOS brauchbare Audiodateien erzeugen, sehr mühsam zu finden sind. Ich habe diese Kombination nach vielem Versuch und Irrtum gefunden. Ich hoffe es spart dir Zeit, viel Spaß!

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

In welchem ​​Format speichern Sie die Aufnahme? .caf? .m4a? Es ist unklar, aus Ihrem Snippet. – Josh

+0

@Josh Das Snippet speichert im m4a-Format, das an 2 Stellen gesetzt ist: 1) im Parameter 'recordSettings' kAudioFormatMPEG4AAC und 2) als explizite .m4a-Erweiterung, die aus self.directoryURL() stammt. Ich habe den Code von directoryURL() zu der Antwort hinzugefügt, so dass Sie sehen können, wo es herkommt. Wichtig: Aus irgendeinem Grund stürzen die meisten Kombinationen von AVSampleRateKey- und AVFormatIDKey-RecordingSettings tatsächlich ab, sodass Sie auf diejenigen beschränkt sind, die funktionieren (ich habe es durch Versuch und Irrtum herausgefunden). – Josh