🎬

CutomなAVPlayerをPictureInPictureする最小構成

に公開

CutomなAVPlayerをPictureInPictureする最小構成の紹介です。

参考ドキュメント
https://developer.apple.com/documentation/AVFoundation/configuring-your-app-for-media-playback
https://developer.apple.com/documentation/avkit/adopting-picture-in-picture-in-a-custom-player

playbackの準備

PictureInPictureを行うにあたって、mediaplayback を可能にする必要があります。
まずは以下のように AVAudioSessioncategory を設定します。

let session = AVAudioSession.sharedInstance()
do {
    try session.setCategory(.playback, mode: .moviePlayback)
} catch  {
    print(error.localizedDescription)
}

実行タイミングはPictureInPicture準備前の段階ならいつでもOKです。

次に Signing & CapabilitiesBackground Modes を追加します。

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

ここまでの設定を行うことで、 mediaplayback が可能になります。

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