2016-11-18 8 views
0

私はFORループから動画を再生する必要があるアプリで作業しています。つまり、ループの各繰り返しで提供される文字列に対してローカルビデオを再生する必要があります。Swift:forループから順番に動画を再生する

問題は、ループからplayVideo()funcを呼び出すときに、すべてのビデオが同時に再生されることです。私はそれらを順番に再生し、AVPlayerLayerを却下する、つまりスーパーレイヤーから削除するようにします。 1つのビデオを再生すると、playerLayerは終了しますが、複数の場合にはplayerLayerは元の状態です。

これを次々と再生するにはどうすればいいですか?

私はディスパッチキューの使用について読んだことがありますが、それらについてはあまりよく分かりません。

コード:

func parseString(string: String){ 
    var stringArray = string.componentsSeparatedByString(" ") 
    logTextView.text = "" 
    for i in 0..<stringArray.count{ 
     playVideo(stringArray[i].lowercaseString) 
    } 
} 

var player: AVPlayer! 
var playerLayer: AVPlayerLayer! 

// video player 

private func playVideo(name: String) { 
    guard let path = NSBundle.mainBundle().pathForResource(name, ofType:"mp4") else { 
     print("file not found") 
     return 
    } 
    player = AVPlayer(URL: NSURL(fileURLWithPath: path)) 
    playerLayer = AVPlayerLayer(player: player) 
    //  playerController.player = player 
    self.playerLayer.frame = self.view.bounds 
    self.view!.layer.addSublayer(self.playerLayer) 
    self.player!.play() 
// playing = true 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.playerDidFinishPlaying(_:)), 
                name: AVPlayerItemDidPlayToEndTimeNotification, object: player.currentItem) 
} 

func playerDidFinishPlaying(note: NSNotification) { 
    print("Video Finished") 
    self.playerLayer.removeFromSuperlayer() 
    // playing = false 
} 

すべてのヘルプは

+0

あなたの問題をここで指摘しているように、あなたのコードをリンクや[最小限の完全かつ検証可能な例を作成する](http://stackoverflow.com/help/mcve)として与えてはいけません。 –

+0

はリンクをコードに置き換えました。問題は理解できますか? –

+0

実際には、私はアイオスについて知らない、それはちょうどあなたの最初の投稿のレビューとダウン票からあなたを保存:) –

答えて

0

は、ループのために使用しないでくださいいただければ幸いです。 int i = 0を取り、i以上stringArray.count

if (i == stringArray.count) { 
    //end 
} 

はあなたがplayerDidFinishPlaying(note: NSNotification)から、上記の実行を行っている機能を、呼び出しになるまで、その後(i++)増加。 これが役立つことを願っています。

+0

そこには、削除され、他の追加されている1つの層の遅れがあります。移行をシームレスにする方法は? –

関連する問題