Xcode
iOS
動画
複数
Swift

iOS 複数動画同時再生

複数動画再生には複数のAVPlayerとAVPlayerLayerを使います。

イメージは以下の通りです
Screen Shot 2016-06-10 at 4.05.49 PM.png

次はコードです。

player.swift
/// プレイヤーを用意
let player1 = AVPlayer(URL: url1) 
let player2 = AVPlayer(URL: url2)
let player3 = AVPlayer(URL: url3)
let player4 = AVPlayer(URL: url4)

/// 各レイヤーにプレイヤーを関連付ける
let playerLayer1 = AVPlayerLayer(player: player1)
let playerLayer2 = AVPlayerLayer(player: player2)
let playerLayer3 = AVPlayerLayer(player: player3)
let playerLayer4 = AVPlayerLayer(player: player4)

/// 各レイヤーの位置・サイズをつけ貼り付け
playerLayer1.frame = CGRectMake(0,0,200,50)
playerLayer2.frame = CGRectMake(200,0,200,50)
playerLayer3.frame = CGRectMake(0,50,200,50)
playerLayer4.frame = CGRectMake(200,50,200,50)
self.view.layer.addSublayer(playerLayer1)
self.view.layer.addSublayer(playerLayer2)
self.view.layer.addSublayer(playerLayer3)
self.view.layer.addSublayer(playerLayer4)

別に1プレイヤー1レイヤーである必要はありません。
以下のイメージで作ってもいいです。

Screen Shot 2016-06-10 at 4.14.27 PM.png

player.swift
/// プレイヤーを用意
let player1 = AVPlayer(URL: url1) 

/// 各レイヤーにプレイヤーを関連付ける
/// 今回は全てプレイヤー1
let playerLayer1 = AVPlayerLayer(player: player1)
let playerLayer2 = AVPlayerLayer(player: player1)
let playerLayer3 = AVPlayerLayer(player: player1)
let playerLayer4 = AVPlayerLayer(player: player1)

/// 各レイヤーの位置・サイズをつけ貼り付け
playerLayer1.frame = CGRectMake(0,0,200,50)
playerLayer2.frame = CGRectMake(200,0,200,50)
playerLayer3.frame = CGRectMake(0,50,200,50)
playerLayer4.frame = CGRectMake(200,50,200,50)
self.view.layer.addSublayer(playerLayer1)
self.view.layer.addSublayer(playerLayer2)
self.view.layer.addSublayer(playerLayer3)
self.view.layer.addSublayer(playerLayer4)

あるアプリ開発では
以下のように、画面下部にサムネイルのように動画を再生させ、
タッチ操作などで、上部のメインのレイヤーに関連付けるプレイヤーを
切り替えいる方法を行いました。

Screen Shot 2016-06-10 at 4.19.55 PM.png

端末によって同時再生数が決まっています。
僕が試している限りではiPhone6, iPad Pro などは16です。
また、AVPlayerの動画との紐付けを解放しないと、4つ再生した後に、その画面のコントローラを解放した後にまた4つ、次もまた4つと再生し、同時再生数の上限に達した時に動画が再生できなくなります。

なのでAVPlayerが必要なくなった時は必ず

self.player.replaceCurrentItemWithPlayerItem(nil)

を行ってください。