2017-09-01 3 views
2

Ich arbeite an der Entwicklung einer App, die Narration spielt, indem nacheinander Satz für Satz Audiodatei abgespielt wird. Mit dem folgenden Code wurde wie erwartet gespielt. Nach dem Hinzufügen der "Stop" -Taste zum Stoppen der Wiedergabe habe ich jedoch festgestellt, dass die "Stop" -Taste den Ton nicht stoppt.AVAudioPlayer stoppt nicht während der Wiedergabe

Ich habe die "Stop" -Taste vor dem Drücken der "Play" -Taste getestet, was kein Problem war (die Nachricht wurde gedruckt). Nach dem Drücken von "Play" und während der Wiedergabe von NarrationPlayer funktioniert die Schaltfläche "Stop" nicht (es wurde keine Nachricht gedruckt).

Irgendeine Idee, was ist los?

import UIKit 
import AVFoundation 

class ViewController: UIViewController,AVAudioPlayerDelegate { 

var NarrationPlayer:AVAudioPlayer = AVAudioPlayer() 
var soundlist: [String] = [] 
var counter = 0 
} 

func playSound(_ soundfile: String) { 

    let NarPath = Bundle.main.path(forResource: soundfile, ofType:"mp3")! 
    let NarUrl = URL(fileURLWithPath: NarPath) 

    do { 
     NarrationPlayer = try AVAudioPlayer(contentsOf: NarUrl) 
     NarrationPlayer.delegate = self 
    } catch{ 
     print(error) 
    } 

    NarrationPlayer.play() 

} 

@IBAction func play(_ sender: Any) { 

soundlist.append("a") 
soundlist.append("b") 
soundlist.append("c") 

playSound("first") 

    while counter < soundlist.count{ 

     if NarrationPlayer.isPlaying == true{ 

     } 
     else{ 
      playSound(soundlist[counter]) 
      counter += 1 
     } 
    } 
} 

@IBAction func StopPlay(_ sender: Any) { 
    print("stop button worked") 
} 
+0

Ich weiß nicht, ob seine verwandten, aber warum gibt es Halter nach Zähler var Schließen – 3stud1ant3

+0

@ 3stud1ant3 weil es eine öffnende Klammer '{ 'für seine jeweilige Klasse –

Antwort

0

Das Problem, das Sie in Laufen sind, ist, dass diese Zeile hier:

ist das Hauptthread hogging, halten jeden Klick auf Ihre „Stop Playing“ Taste aus eigentlich feuern.

Sie haben jedoch eine Delegate-Methode festgelegt, und eines der sehr praktischen Dinge, die Sie hier tun können, erhöht Ihren Zähler und spielt die nächste Audiodatei jedes Mal ab, wenn eine Audiodatei beendet wird.

Etwas wie folgt aus:

func playSound(_ soundfile: String) { 

     let NarPath = Bundle.main.path(forResource: soundfile, ofType:"mp3")! 
     let NarUrl = URL(fileURLWithPath: NarPath) 

     do { 
      NarrationPlayer = try AVAudioPlayer(contentsOf: NarUrl) 
      NarrationPlayer.delegate = self 
     } catch{ 
      print(error) 
     } 

     NarrationPlayer.play() 

} 

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) 
{ 
    playSound(self.soundlist[counter]) 
    counter += 1 
} 

@IBAction func play(_ sender: Any) { 

    playSound("first") 

    soundlist.append("a") 
    soundlist.append("b") 
    soundlist.append("c") 
} 

Ein letzter Ratschlag:

Ändern Sie den Namen NarrationPlayer-narrationPlayer. Variablen in Swift, wie in Objective-C, sollten mit Kleinbuchstaben beginnen (auch bekannt als lowCamelCase).

+0

Vielen Dank, dass das Problem behoben. Um die Wiedergabe am Ende der Array-Liste zu stoppen, habe ich if-Anweisung hinzugefügt. func audioPlayerDidFinishPlaying (_ Spieler: AVAudioPlayer, erfolgreich Flagge: Bool) { wenn Zähler

Verwandte Themen