2017-09-01 9 views
2

Je travaille sur le développement d'une application qui lit la narration en lisant les fichiers son phrase par phrase les uns après les autres. Avec le code ci-dessous, il a joué comme prévu. Cependant, après avoir ajouté le bouton "Stop" pour arrêter ce qui est en train de jouer, j'ai trouvé que le bouton "Stop" n'arrêtait pas le son.AVAudioPlayer ne s'arrête pas en cours de lecture

J'ai testé le bouton "Stop" avant d'appuyer sur le bouton "Play", ce qui n'a pas fonctionné (le message a été imprimé). Cependant, après avoir appuyé sur "Play" et pendant la lecture de NarrationPlayer, le bouton "Stop" n'a pas fonctionné (aucun message n'a été imprimé).

Une idée de ce qui ne va pas?

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

Je ne sais pas si c'est lié mais pourquoi y a-t-il une parenthèse de fermeture après le compteur de var – 3stud1ant3

+0

@ 3stud1ant3 parce qu'il y a une parenthèse d'ouverture '{' pour sa classe respective –

Répondre

0

Le problème que vous utilisez en est que cette ligne ici:

monopolise le thread principal, en gardant tout clic sur le bouton « Stop Playing » de tirer réellement.

Vous avez cependant défini une méthode déléguée, et l'une des choses très pratiques que vous pouvez faire ici est d'incrémenter votre compteur et de lire votre fichier audio suivant chaque fois qu'un fichier son est terminé.

Quelque chose comme ceci:

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") 
} 

Un dernier conseil:

Modifier le nom NarrationPlayer-narrationPlayer. Les variables dans Swift, comme dans Objective-C, devraient commencer par des minuscules (également appelées lowerCamelCase).

+0

Merci beaucoup, cela a résolu le problème. Pour arrêter la lecture à la fin de la liste, j'ai ajouté if. func audioPlayerDidFinishPlaying (_ joueur: AVAudioPlayer, drapeau avec succès: Bool) { si le compteur