NotificationとKVOを使って動画を自動ループさせる

 

動画の状態と、動画が終わったタイミングをKVOを使って監視してNotificationを使って状態の変更をキャッチして動画をループさせます。

環境

  • Xcode8
  • Swift3

実装

import UIKit
import AVFoundation

class ViewController: UIViewController {
     /*
     動画を再生させる画面作る
     */
    lazy var player: AVPlayer = {
        var player: AVPlayer = AVPlayer(playerItem: self.playerItem)
        player.actionAtItemEnd = AVPlayerActionAtItemEnd.none
        return player
    }()


    lazy var playerItem: AVPlayerItem = {
        var playerItem: AVPlayerItem = AVPlayerItem(asset: self.asset)
        return playerItem
    }()


    lazy var asset: AVURLAsset = {
        var asset: AVURLAsset = AVURLAsset(url: self.url)
        asset.resourceLoader.setDelegate(self, queue: DispatchQueue.main)
        return asset
    }()


    lazy var playerLayer: AVPlayerLayer = {
        var playerLayer: AVPlayerLayer = AVPlayerLayer(player: self.player)
        playerLayer.frame = UIScreen.main.bounds
        playerLayer.backgroundColor = UIColor.clear.cgColor
        return playerLayer
    }()


     /*
     動画のURLを定義している
     */
    var url: URL = {
        var url = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
        return url!
    }()


     /*
     viewDidLoad
     */
    override func viewDidLoad() {
        super.viewDidLoad()

        //動画のアイテムを監視
        playerItem.addObserver(self, forKeyPath: "status", options: .new, context: nil)

        //動画が終わったタイミングを監視
        NotificationCenter.default.addObserver(self, selector: #selector(playerItemDidReachEnd(_:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)

        //画面、動画が現れる
        view.layer.addSublayer(playerLayer)

        //動画を再生
        player.play()
    }


    // 監視対象の値に変化があった時に呼ばれる
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {}

    //動画を一番最初まで巻き戻す的な
    func playerItemDidReachEnd(_ notification: Notification) {

        player.seek(to: kCMTimeZero)
    }
}

//AVAssetResourceLoaderDelegate使わなきゃいけないから拡張
extension ViewController : AVAssetResourceLoaderDelegate {

}

参考

SwiftでKVOを試してみる
[Swift3.0] KVO(Key-Value Observing)による変数の監視

ソース

GitHub

NotificationとKVOを使って動画を自動ループさせる

藤沢瞭介(Ryosuke Hujisawa)
  • りょすけと申します。18歳からプログラミングをはじめ、今はフロントエンドでReactを書いたり、AIの勉強を頑張っています。off.tokyoでは、ハイテクやガジェット、それからプログラミングに関する情報まで、エンジニアに役立つ情報を日々発信しています!

未整理記事