AVPlayer を用いて画像を6秒表示させたい
AVPlayerで静止画(png)をシークバー付きで6秒間表示するような機能を作成しています。
現在のコードはこのようなのですが最後の最後がわからなく、つまっています。
ご教授よろしくお願いいたします。
let fileURL = URL(fileURLWithPath: "sample.png")
let asset = AVAsset(url: fileURL )
let imageGenerator = AVAssetImageGenerator(asset: asset)
// AVPlayerに再生させるアイテムを生成.
playerItem = AVPlayerItem(asset: avAsset)
// AVPlayerを生成.
videoPlayer = AVPlayer(playerItem: playerItem)
// Viewを生成.
let videoPlayerView = AVPlayerView(frame: self.view.bounds)
// UIViewのレイヤーをAVPlayerLayerにする.
let layer = videoPlayerView.layer as! AVPlayerLayer
layer.videoGravity = AVLayerVideoGravity.resizeAspect
layer.player = videoPlayer
// レイヤーを追加する.
self.view.layer.addSublayer(layer)
seekBar = UISlider(frame: CGRect(x: 0, y: 0, width: self.view.bounds.maxX - 100, height: 50))
seekBar.layer.position = CGPoint(x: self.view.bounds.midX, y: self.view.bounds.maxY - 100)
seekBar.minimumValue = 0
seekBar.maximumValue = 6
seekBar.addTarget(self, action: #selector(onSliderValueChange(sender:)), for: UIControl.Event.valueChanged)
self.view.addSubview(seekBar)
NotificationCenter.default.addObserver(self, selector:#selector(MovieVC.didPlayToEndTime), name: .AVPlayerItemDidPlayToEndTime, object: videoPlayer.currentItem)
let interval : Double = Double(0.5 * seekBar.maximumValue) / Double(seekBar.bounds.maxX)
// CMTimeに変換する.
let time : CMTime = CMTimeMakeWithSeconds(interval, preferredTimescale: Int32(NSEC_PER_SEC))
// time毎に呼び出される.
videoPlayer.addPeriodicTimeObserver(forInterval: time, queue: nil, using: {time in
// 総再生時間を取得.
let duration = 6
// 現在の時間を取得.
let time = CMTimeGetSeconds(self.videoPlayer.currentTime())
// シークバーの位置を変更.
let value = Float(self.seekBar.maximumValue - self.seekBar.minimumValue) * Float(time) / Float(duration) + Float(self.seekBar.minimumValue)
self.seekBar.value = value
})
// 再生時間を最初に戻して再生.
videoPlayer.seek(to: CMTimeMakeWithSeconds(0, preferredTimescale: Int32(NSEC_PER_SEC)))
videoPlayer.play()
こちらのサイトを参考にさせていただいております。
動画の生成-Fabo Swift Docs