再生/停止ボタンと再生位置をコントロールするスライダーのみを備えたシンプルな動画ファイル再生機.
こんな感じ
プロジェクト
GitHubにソース上げてあります. → VideoPlayer
要点
- import AVKit
- AVPlayerに動画のURLを渡して初期化
- AVPlayerLayerを任意のViewのレイヤーに差し込む
- AVPlayer.play/stopで再生停止
- AVPlayer.currentItem!.asset.durationで総再生時間の取得
- AVPlayer.currentItem!.currentTime().secondsで現在の再生位置取得
- AVPlayer.seek(to:, toleranceBefore:, toleranceAfter:)で再生位置の制御
- AVPlayer.addPeriodicTimeObserver(forInterval:, queue:, using:)で再生中の位置を逐次取得してスライダーに反映
ポイント
再生中かどうかチェック
var isPlaying: Bool {
return player?.rate != 0 && player?.error == nil
}
.seekの罠
AVPlayer.seek(to: )
では表示されるコマは更新されない.AVPlayer.seek(to:, toleranceBefore: .zero, toleranceAfter: .zero)
を使うこと.
CMTimeの作り方
CMTime(seconds:, preferredTimescale:)
でつくる際のpreferredTimescale
は小数点第何位までみるかの指定.1000を入れたら小数点第3位までみる(0.001秒とか)
CMTimeから00:00:00形式の文字列で現在の時間を取得する
extension CMTime {
var positionalTime: String {
let floorSeconds: TimeInterval = floor(seconds)
let hours = Int(floorSeconds / 3600)
let minute = Int(floorSeconds.truncatingRemainder(dividingBy: 3600) / 60)
let second = Int(floorSeconds.truncatingRemainder(dividingBy: 60))
if hours > 0 {
return String(format: "%d:%02d:%02d", hours, minute, second)
}
return String(format: "%02d:%02d", minute, second)
}
}
備考
StoryboardのコンポーネントとしてあるAVKit Player View
を用いた場合は,開発版ではちゃんと動くのに配布版だとビューが読み込まれなくなるようだった.何か設定が足りないのだと思うが...