Edited at

iOS 複数動画同時再生

More than 1 year has passed since last update.

複数動画再生には複数の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)

を行ってください。