[Swift4/Cocoa] AVPlayerViewとNotificationCenterで動画をループ再生

2018年6月23日(更新: 2018年6月25日)

AVPlayerView で再生している動画が終わると、自動的に巻き戻して初めから再生する。ループ再生可能な動画プレイヤーの Swift でのサンプルです。

AVPlayerView に読み込んだ動画(AVPlayerItem)が終わったことを NotificationCenter で監視します。

サンプルの動作

動画を最後まで再生し終わると、自動的に先頭に巻き戻って再生が始まります。

自動的に動画をループ再生するAVPlayerView

サンプルコード

Cocoa App」として新規作成したプロジェクトの ViewController.swift を以下のように書き換えます。

import Cocoa
import AVFoundation
import AVKit

class ViewController: NSViewController {
    
    var playerView: AVPlayerView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // AVPlayerView のインスタンス化と画面への追加  
        playerView = AVPlayerView(frame: self.view.frame)
        self.view.addSubview(playerView)
        
        // 動画を読み込み、動画プレイヤーに設定
        if let path = Bundle.main.path(forResource: "test", ofType: "mp4") {
            let url = URL(fileURLWithPath: path)
            let asset = AVAsset(url: url)
            let playerItem = AVPlayerItem(asset: asset)
            playerView.player = AVPlayer(playerItem: playerItem)
        }
        
        // 動画が再生し終わったことを監視する設定
        NotificationCenter.default.addObserver(
                self, selector: #selector(self.endOfMovie), 
                name: .AVPlayerItemDidPlayToEndTime, object: nil)
    }
    
    @objc func endOfMovie() {
        
        // 動画を先頭まで巻き戻す
        playerView.player?.seek(to: CMTime(seconds: 0, preferredTimescale: 1))
        
        // 巻き戻し後に自動再生
        playerView.player?.play()
    }

    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.
        }
    }
}

NotificationCenter で .AVPlayerItemDidPlayToEndTime を指定します。これは AVPlayerItem の動画が終わったときに通知を送信するオプションです。

この通知を受け取ったときの処理はメソッド endOfMovie に記述しています。ここで AVPlayerView のプロパティである player (AVPlayer) に、動画先頭へのシークと自動再生の処理を行わせています。

以上が、動画をループ再生する AVPlayerView の作成方法です。

ちなみに NotificationCenter で .AVPlayerItemTimeJumped を指定すると、シークバーの移動や動画の一時停止後の再生などのタイミングで通知を受け取ることができます。

コメントを残す

メールアドレスが公開されることはありません。