41
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

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)

を行ってください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
41
Help us understand the problem. What are the problem?