2015-06-28 4 views
5

ich den folgenden Code versuche swift 2 verwenden, die in schnellen 1.swift2 AVAudioRecorder

class NewSoundViewController: UIViewController { 
required init(coder aDecoder: NSCoder) { 
    let audioURL = NSURL.fileURLWithPathComponents([ 
     NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0], 
     "MyAudio.m4a" 
    ]) 
    do { 
     let session = AVAudioSession.sharedInstance() 
     try session.setCategory(AVAudioSessionCategoryPlayAndRecord) 
    } catch { 
     print("Session errors.") 
    } 

    do { 
     let recordSettings: [String: AnyObject] = [ 
      AVFormatIDKey: kAudioFormatMPEG4AAC, 
      AVSampleRateKey: 44100.0, 
      AVNumberOfChannelsKey: 2, 
     ] 
     self.audioRecorder = try AVAudioRecorder(URL: audioURL!, settings: recordSettings) 
     self.audioRecorder.meteringEnabled = true 
     self.audioRecorder.prepareToRecord() 

    } catch let error as NSError{ 
     print(error.description) 
    } catch { 
     print("Other errors")    
    } 
    super.init(coder: aDecoder) 
} 

sollte in Ordnung sein Ich habe kompilieren Fehler

Typ 'AudioFormatID' entspricht nicht Protokoll ‚ANYOBJECT ‚`

an der Linie AVFormatIDKey: kAudioFormatMPEG4AAC,.

Wenn ich die Zeile aus kommentieren, ging ich zu bauen, bekam aber einen Laufzeitfehler

Fehler Domain = NSOSStatusErrorDomain Code = 1718449215 „Der Vorgang konnte nicht abgeschlossen werden. (OSStatus Fehler 1718449215.)“

ich habe auch versucht AVFormatIDKey: NSNumber(unsignedInt: kAudioFormatMPEG4AAC), und Laufzeitfehler bekam. Xcode schien den Debug-Modus gehen sie rot self.audioRecorder = try AVAudioRecorder(URL: audioURL!, settings: recordSettings) hervorgehoben und sagte

Gewinde 1: EXC_BAD_ACCESS (code = 1, Adresse = 0x0)

Kann jemand mir bitte helfen?

Antwort

3

Ich habe auch versucht AVFormatIDKey: NSNumber(unsignedInt: kAudioFormatMPEG4AAC)

Nun, dass die richtige Sache zu sagen ist. Grundsätzlich fragen Sie zwei Fragen hier; Der Compilerfehler, den Sie bereits gelöst haben. Jetzt haben Sie einen Laufzeitfehler, aber das ist eine ganz andere Sache.

Wie für die Laufzeitfehler, es ist wahrscheinlich nur eine Ausgeburt versuchen, auf dem Simulator zu testen. Ich habe deinen Code auf dem Gerät ausgeführt (nachdem die fragliche Zeile repariert wurde, damit sie kompiliert werden kann) und es ist in Ordnung.

EDIT In einem Kommentar haben Sie gezeigt, dass Sie dies auf einem Gerät mit iOS 8.3 getestet haben. Das ist das Problem! Sie müssen auf einem Gerät testen, und es muss ein Gerät sein iOS läuft 9. Dann werden Sie feststellen, dass Ihr Code ausgeführt wird, ohne abzustürzen.

+0

Hmmm ... Ich ausgedruckt 'audioURL' und es zeigte' MyAudio.m4a' so ich nehme an, es ist nicht Null. –

+0

Ich habe Ihren Code getestet und es läuft gut auf dem Gerät. Sie haben wahrscheinlich nur ein Problem mit dem Simulator, weil Sie dort nicht aufnehmen können. – matt

+0

Leider funktioniert es weder für mein iPhone noch für den Simulator. Danke für deine Tests trotzdem! –

0

ich ein ähnliches Problem hatte und es stellt sich heraus, dass, wenn ich von einer schnellen 1,2 bis 2,0 die Unterschrift von „Einstellungen“ auf eine nicht optional geändert aktualisiert [String: ANYOBJECT]

//Swift 1.2 
AVAudioRecorder(URL: audioURL!, settings: nil) 

wenn passiere ich ein leeres Wörterbuch bricht es nicht mehr für mich ab und funktioniert wie zuvor.

//Swift 2.0  
AVAudioRecorder(URL: audioURL!, settings: [:]) 
2

Ich hatte das gleiche Problem mit den Einstellungen. AVFormatIDKey wurde mit dem Fehler, der in dem ursprünglichen Post erwähnt wird, nicht akzeptiert.

Die recordSettings explizit in Swift gegossen werden muss, 2.

sind meine Einstellungen für die Aufnahme sind, die funktioniert. Wenn ich nur den AVFormatIDKey überspringe, funktioniert das Mikrofon nur für den Bruchteil einer Sekunde.

let recordSettings = [AVSampleRateKey : NSNumber(float: Float(44100.0)), 
     AVFormatIDKey : NSNumber(int: Int32(kAudioFormatAppleLossless)), 
     AVNumberOfChannelsKey : NSNumber(int: 1), 
     AVEncoderAudioQualityKey : NSNumber(int: Int32(AVAudioQuality.Medium.rawValue)), 
     AVEncoderBitRateKey : NSNumber(int: Int32(320000))] 

Sie müssen das Gerät nicht auf iOS 9 aktualisieren.Ich baute und lief das für iOS 8.4

+0

das war * extrem * hilfreich, danke. Ich jage das seit Tagen. – CodeNoob

+0

Thnks viel Arbeit für mich –