4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Swift:AVPlayerでシンプルな動画プレイヤーをつくる

Posted at

再生/停止ボタンと再生位置をコントロールするスライダーのみを備えたシンプルな動画ファイル再生機.

こんな感じ

demo.png

プロジェクト

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を用いた場合は,開発版ではちゃんと動くのに配布版だとビューが読み込まれなくなるようだった.何か設定が足りないのだと思うが...

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?