2017-03-07 13 views
0

私はデータベースから音楽をストリーミングする音楽ストリーミングアプリを開発しています。私のコードはデータベース内の各曲のボタンを動的に作成し、これらのボタンをクリックするとmp3ファイルを再生します。しかし、私は音楽を一時停止する方法を理解することができず、ボタンを2回以上クリックすると、その曲が再生され、2曲が同時に再生されます。私はすでにplayer.pause()などを試していますが、音楽の再生/ストリーミングやループを止めることは何もありません。AVPlayerループを停止する

import UIKit 
import AVKit 
import AVFoundation 


class ViewController: UIViewController { 

var songArray: [Array<String>] = [] //array to contain song names and filepaths 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    //connect to website 
    let url = URL(string:"http://cgi.soic.indiana.edu/~team22/SongData.php") 
    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in 
     if error != nil 
     { 
      print("error") 
     } 
     else 
     { 
      if let content = data 
      { 
       do 
       { 
        //download JSON data from php page, display data 
        let JSON = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as! [[String]] 
        print(JSON) 

        //Make buttons with JSON array 
        var buttonY: CGFloat = 20 
        for song in JSON { 
         //add information to array 
         self.songArray.append(song) 
         let SongButton = UIButton(frame: CGRect(x: 50, y: buttonY, width: 250, height: 30)) 
         buttonY = buttonY + 50 // 50px spacing 

         SongButton.layer.cornerRadius = 10 //Edge formatting for buttons 

         SongButton.backgroundColor = UIColor.darkGray //Color for buttons 

         SongButton.setTitle("\(song[0])", for: UIControlState.normal) //button title 

         SongButton.titleLabel?.text = "\(song[0])" // set title label 

         SongButton.addTarget(self,action: #selector(self.songButtonPressed(_:)), for: UIControlEvents.touchUpInside) //button press/response 

         self.view.addSubview(SongButton) // adds buttons to view 
        } 
       } 
       catch 
       { 

       } 
      } 
     } 
    } 
    task.resume() 
    print(songArray) 

} 


func songButtonPressed(_ sender:UIButton!) { // Streaming function for buttons when pressed 
    for song in songArray { 
     if "\(song[0])" == sender.titleLabel?.text { //compare loop element to name of button pressed 



      let URL = NSURL(string: song[1]) //plug loop element into audio player 
      let player = AVPlayer(url: URL! as URL) 
      let playerLayer = AVPlayerLayer(player: player) 
      playerLayer.frame = self.view.bounds 
      self.view.layer.addSublayer(playerLayer) 
      player.play() 
     } 
    } 
} 
} 

答えて

1

ここで問題となるのは、ボタンをクリックして参照を保持しなくなるたびに新しいプレーヤーを作成することです。後でプレイヤーを停止/一時停止、またはアクセスすることはできません。

ビューに1人のプレイヤーのみが存在し、一度に1つのアイテムしか再生しないようにしてください。AVQueuePlayerを使用して再生するアイテムの 'プレイリスト'を管理して、アイテムを順番に再生できます。

AVQueuePlayerはAVPlayerのサブクラスなので、一時停止/停止などの通常の機能をすべて呼び出すことができます。

アイテムの配列で初期化します(最初は1つにすることができます)。後でアイテムを追加します。あなたがこれを取り組むしかし

、あなたが関数内でこの

let player = AVPlayer(url: URL! as URL) 

を持つべきではない、ビューのシングルプレイヤーまたはAVQueuePlayerを持っていると、あなたは後でそれを参照することができます。そうするself.player.pause()

関連する問題