2017-10-09 3 views
0

Ich habe eine Struktur mit meinem Audio-Player drin:Swift 3: AVAudioPlayer spielt keinen Ton

struct MT_Audio { 

    func playAudio(_ fileName:String, _ fileExtension:String, _ atVolume:Float) { 
     var audioPlayer = AVAudioPlayer() 
     if let audioPath = Bundle.main.path(forResource: fileName, ofType: fileExtension) { 
      let audioURL = URL(string:audioPath) 
      do { 
       audioPlayer = try AVAudioPlayer(contentsOf: audioURL!) 
       audioPlayer.volume = atVolume 
       audioPlayer.prepareToPlay() 
       audioPlayer.play() 
      } catch { 
       print(error) 
      } 
     } 
    } 
} 

//I'm calling it in viewDidLoad like this: 

    guard let fileURL = Bundle.main.url(forResource:"heartbeat-01a", withExtension: "mp3") 
     else { 
       print("can't find file") 
       return 
      } 

     let myAudioPlayer = MT_Audio() //<--RESOLVED THE ISSUE BY MAKING THIS A PROPERTY OF THE VIEWCONTROLLER 
     myAudioPlayer.playAudio("heartbeat-01a", "mp3", 1.0) 

Da es nicht zum Absturz nicht und brennt auf der Wache ich die Datei weiß, gibt es. Ich habe auch nach dem Versuch eine Pause gemacht und komme zum Audioplayer. Wenn ich zur eigentlichen Datei gehe und in Xcode darauf klicke, wird abgespielt. Dies schlägt sowohl auf der SIM als auch auf dem Gerät fehl. Jede Hilfe wäre willkommen.

+0

Werfen Sie einen Blick in das rechte Fenster in Xcode. Wenn die Datei ausgewählt ist, sollte die Zielmitgliedschaft überprüft werden. Wenn nicht, überprüfen Sie es und versuchen Sie es erneut. –

+0

Ich hatte das vor dem Posten überprüft. Aber danke für den Vorschlag. – PruitIgoe

+0

_Seite note_ Sie sollten vermeiden, dass diese 'implizite, unverpackte Option ', die Sie in' audioURL! 'Haben. Bundle.main stellt eine URL-Methode zur Verfügung, die eine optionale URL zurückgibt, die stattdessen 'if audioUrl = Bundle.main.url (forResource: fileName, withExtension: fileExtension)' – Lamar

Antwort

1

Ihr audioPlayer wird nur in Ihrer playAudio Funktion gespeichert.

Versuchen Sie, die audioPlayer als Variable in Ihrer Klasse wie folgt zu halten:

struct MT_Audio { 

    var audioPlayer: AVAudioPlayer? 

    mutating func playAudio(_ fileName:String, _ fileExtension:String, _ atVolume:Float) { 

     // is now member of your struct -> var audioPlayer = AVAudioPlayer() 
     if let audioPath = Bundle.main.path(forResource: fileName, ofType: fileExtension) { 
      let audioURL = URL(string:audioPath) 
      do { 
       let audioPlayer = try AVAudioPlayer(contentsOf: audioURL!) 
       audioPlayer.volume = atVolume 
       audioPlayer.prepareToPlay() 
       audioPlayer.play() 
      } catch { 
       print(error) 
      } 
     } 
    } 
} 
+0

Danke für den Vorschlag. Immer noch kein Ton. Nicht sicher, warum das Verschieben von audioPlayer in eine globale Variable innerhalb der Struktur wichtig ist, wenn Audio abgespielt wird oder nicht. Ich habe es in meinem Code überprüft und es wurde instanziiert. Der Dateipfad ist korrekt. Die MP3-Datei wird wiedergegeben, wenn sie in Xcode ausgewählt wird. Das wird ein Morgen von grrrrr. – PruitIgoe

+0

Es funktioniert, Sie bringen mich auf den richtigen Weg - siehe oben meinen Kommentar und ändert meinen Code. – PruitIgoe