2017-11-08 1 views
2

Ich versuche, eine Anwendung, die zu erstellen:Audiokit stürzt

  1. Aufzeichnungen meines Mikrofon und speichert die Ausgabe in eine Datei
  2. Spielt die zuletzt aufgenommene Datei
  3. Die Wiedergabe mit Effekten manipuliert werden, sollte so als Pitch-Shift

Bisher habe ich 1 + 2 nach unten kam, aber wenn ich versuche, die AudioKit.output meiner timePitch (oder Pitch Shifter für diese Angelegenheit) zuweisen, erhalte ich eine Ausnahme (siehe unten) . Kann mir jemand helfen? Scheint, wie wenn ich Ausgabe auf etwas anderes als Spieler gesetzt, stürzt es ..

Haftungsausschluss: meine schlechten Code

2017-11-08 16:39:58.637075+0100 mysoundplayer[41113:759865] *** Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'player started when in a disconnected state' 
*** First throw call stack: 
(
    0 CoreFoundation      0x0000000108a3c1ab __exceptionPreprocess + 171 
    1 libobjc.A.dylib      0x00000001047ddf41 objc_exception_throw + 48 
    2 CoreFoundation      0x0000000108a41372 +[NSException raise:format:arguments:] + 98 
    3 AVFAudio       0x000000010b3bb00e _Z19AVAE_RaiseExceptionP8NSStringz + 158 
    4 AVFAudio       0x000000010b4131ce _ZN21AVAudioPlayerNodeImpl9StartImplEP11AVAudioTime + 204 
    5 AVFAudio       0x000000010b412482 -[AVAudioPlayerNode playAtTime:] + 82 
    6 AudioKit       0x0000000103a2270d _T08AudioKit13AKAudioPlayerC4playySo11AVAudioTimeCSg2at_tFTf4gn_n + 1933 
    7 AudioKit       0x0000000103a1c78d _T08AudioKit13AKAudioPlayerC5startyyF + 45 
    8 mysoundplayer       0x00000001035dd3b8 _T010mysoundplayer14ViewControllerC14playLoadedFileyyF + 1832 
    9 mysoundplayer       0x00000001035dca1e _T010mysoundplayer14ViewControllerC4playySo8UIButtonCF + 46 
    10 mysoundplayer       0x00000001035dca6c _T010mysoundplayer14ViewControllerC4playySo8UIButtonCFTo + 60 
    11 UIKit        0x000000010507c275 -[UIApplication sendAction:to:from:forEvent:] + 83 
    12 UIKit        0x00000001051f94a2 -[UIControl sendAction:to:forEvent:] + 67 
    13 UIKit        0x00000001051f97bf -[UIControl _sendActionsForEvents:withEvent:] + 450 
    14 UIKit        0x00000001051f81e7 -[UIControl touchesBegan:withEvent:] + 282 
    15 UIKit        0x00000001050f1916 -[UIWindow _sendTouchesForEvent:] + 2130 
    16 UIKit        0x00000001050f32de -[UIWindow sendEvent:] + 4124 
    17 UIKit        0x0000000105096e36 -[UIApplication sendEvent:] + 352 
    18 UIKit        0x00000001059d9434 __dispatchPreprocessedEventFromEventQueue + 2809 
    19 UIKit        0x00000001059dc089 __handleEventQueueInternal + 5957 
    20 CoreFoundation      0x00000001089df231 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17 
    21 CoreFoundation      0x0000000108a7ee41 __CFRunLoopDoSource0 + 81 
    22 CoreFoundation      0x00000001089c3b49 __CFRunLoopDoSources0 + 185 
    23 CoreFoundation      0x00000001089c312f __CFRunLoopRun + 1279 
    24 CoreFoundation      0x00000001089c29b9 CFRunLoopRunSpecific + 409 
    25 GraphicsServices     0x000000010cc289c6 GSEventRunModal + 62 
    26 UIKit        0x000000010507a5e8 UIApplicationMain + 159 
    27 mysoundplayer       0x00000001035e12a7 main + 55 
    28 libdyld.dylib      0x000000010aa49d81 start + 1 
    29 ???         0x0000000000000001 0x0 + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

Quellcode ich Swift neu bin, also bitte einfach auf mich gehen und vergeben:

import AudioKit 
import AudioKitUI 
import UIKit 

class ViewController: UIViewController { 

var micMixer: AKMixer! 
var recorder: AKNodeRecorder! 
var player: AKAudioPlayer! 
var tape: AKAudioFile! 
var timePitch: AKTimePitch! 
var pitchShifter: AKPitchShifter! 
var mainMixer : AKMixer! 
var loadedFile: AKAudioFile! 

let mic = AKMicrophone() 

var state = State.readyToRecord 

enum State { 
    case readyToRecord 
    case recording 
    case readyToPlay 
    case playing 
} 

@IBAction func toggleRecord(_ sender: UIButton) { 
    switch state { 
    case .recording: 
     sender.setTitle("record", for: .normal) 
     state = .readyToRecord 
     do { 
      try player.reloadFile() 
     } catch { 
      print("Error reloading!") 
     } 

     let recordedDuration = player != nil ? player.audioFile.duration : 0 
     if recordedDuration > 0.0 { 
      recorder.stop() 
      let randomfilename:String = NSUUID().uuidString + ".m4a" 
      print("Filename: \(randomfilename)") 
      player.audioFile.exportAsynchronously(name: randomfilename, baseDir: .documents, exportFormat: .m4a, callback: {file, exportError in 
       if let error = exportError { 
        print("Export failed \(error)") 
       } else { 
        print("Export succeeded") 
        self.loadedFile = file 
       } 
      }) 
     } 
    case .readyToRecord: 
     do { 
      try recorder.record() 
      sender.setTitle("stop", for: .normal) 
      state = .recording 
     } catch { print("Error recording!") } 

    default: 
     print("no") 
    } 
} 


@IBAction func play(_ sender: UIButton) { 
    playLoadedFile() 
} 

@IBAction func valueChanged(_ sender: UISlider) { 
    timePitch.pitch = Double(sender.value) 
} 

func playLoadedFile() { 
    do { 
     try player.replace(file: loadedFile) 
     player.start() 
    } catch { print("Error playing!") } 
} 

func exportedAudioFile(filename: String) { 
    print("yay") 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view, typically from a nib. 

    AKAudioFile.cleanTempDirectory() 
    AKSettings.bufferLength = .medium 
    AKSettings.defaultToSpeaker = true 

    //inputPlot.node = mic 
    micMixer = AKMixer(mic) 
    mainMixer = AKMixer(player,timePitch) 

    pitchShifter = AKPitchShifter(player) 
    timePitch = AKTimePitch(player) 

    recorder = try? AKNodeRecorder(node: micMixer) 
    if let file = recorder.audioFile { 
     player = try? AKAudioPlayer(file: file) 
    } 

    AudioKit.output = timePitch // works with player 
    AudioKit.start() 
    print("mainMixer status: \(mainMixer.isStarted)") 


} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

}

+1

Können Sie ein Projekt auf Github teilen, damit ich es selbst ausprobieren kann? –

Antwort

2

Es ist wie mainMixer aussieht ist mit nichts verbunden. Versuchen Sie, AudioKit.output = timePitch zu AudioKit.output = mainMixer zu ändern.

Best Practices, entfernen Sie alle try? s. Verwenden Sie einen Versuch Versuch fangen und zumindest den Fehler ausdrucken.

if let file = recorder.audioFile { 
    do{ 
     player = try AKAudioPlayer(file: file) 
    } catch { 
     print(error) 
    } 
} 
+0

Hallo Dave, danke, ich habe versucht, die Ausgabe zu MainMixer stattdessen zuweisen (mit TimePitch MainMixer hinzugefügt), aber das gleiche Ergebnis :( – Kevin

+0

Immer noch "Player gestartet, wenn in einem getrennten Zustand"? – dave234

0

Sie verbinden den Player mit dem Mixer, bevor Sie ihn erstellen. Zu der Zeit, wo Sie AKMixer() Spieler geben, ist es gleich Null. Verschieben Sie die Mixer-Erstellung nach der Player-Zuweisung.

+0

Max, du hast Recht! Ich zog die Mixer- und Pitch-Creation nach der Spieler-Erstellung, und nun funktioniert es wie ein Zauber! – Kevin

Verwandte Themen