🎬
CutomなAVPlayerをPictureInPictureする最小構成
CutomなAVPlayerをPictureInPictureする最小構成の紹介です。
参考ドキュメント
playbackの準備
PictureInPictureを行うにあたって、media の playback を可能にする必要があります。
まずは以下のように AVAudioSession の category を設定します。
let session = AVAudioSession.sharedInstance()
do {
try session.setCategory(.playback, mode: .moviePlayback)
} catch {
print(error.localizedDescription)
}
実行タイミングはPictureInPicture準備前の段階ならいつでもOKです。
次に Signing & Capabilities で Background Modes を追加します。

続いて、「Audio, AirPlay, and Picture in Picture」を選択します。

ここまでの設定を行うことで、 media の playback が可能になります。
PictureInPictureの準備
続いてPictureInPictureの準備を行います。
今回は、端末に保存している動画のURLを取得し、 AVPlayer を準備する想定です。
var player: AVPlayer!
var playerLayer: AVPlayerLayer!
var pipController: AVPictureInPictureController!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
player = AVPlayer(url: videoURL)
playerLayer = AVPlayerLayer(player: player)
// 適当な大きさに調整
playerLayer?.frame = .init(origin: .zero, size: view.frame.size)
playerLayer?.videoGravity = .resizeAspect
// 適当なViewに追加
view.layer.addSublayer(playerLayer)
pipController = AVPictureInPictureController(playerLayer: playerLayer)
PictureInPictureの開始
上で準備した pipController を使ってPictureInPictureの開始をします。
pipController.startPictureInPicture()
これでPictureInPictureの開始ができます。
よりしっかりと実装する場合は pipController.delegate を設定したり、 pipController.isPictureInPictureActive を確認したりする必要があります。
その際は先頭のドキュメントを参考にしてください。
Discussion