🎥

【iOS】AVPlayerで動画を再生する

2024/03/03に公開

AVPlayerの使い方

メディア再生は、iOS、tvOS、macOSアプリケーションの開発において重要な機能の一つです。AppleのAVFoundationフレームワークは、オーディオおよびビデオの再生を含む、豊富なメディア関連の操作を提供します。

その中のAVPlayerについてWrapperを見ながらAVPlayerの基本的な内容を確認していきましょう

AVPlayerWrapperの概要

AVPlayerWrapperは、AVPlayerの機能を簡略化し、開発者がメディア再生に関連する一般的なタスクを簡単に実行できるように設計されたクラスです。メディアの再生、一時停止、停止、シーク、音量調整などの操作をAPIで行うことができます。

主な機能

  • メディアの再生: play()メソッドを呼び出すことで、指定されたURLのメディアを再生開始します。
  • 再生の一時停止と停止: pause()メソッドとstop()メソッドにより、メディアの再生を一時停止または停止し、再生位置を開始位置に戻すことができます。
  • シーク操作: seek(to:)メソッドを使用して、メディア内の特定の時間にジャンプすることが可能です。
  • 前進と後退: skipForward(by:)skipBackward(by:)メソッドを用いて、現在の再生位置から指定された秒数だけ前進または後退します。
  • 音量の調整: volumeプロパティを通じて、再生中のメディアの音量を調整できます。
  • 再生速度の調整: rateプロパティにより、再生速度を変更することができます。

利用例

import AVFoundation

let mediaURL = URL(string: "https://example.com/media.mp4")!
let playerWrapper = AVPlayerWrapper(url: mediaURL)

// メディアの再生を開始
playerWrapper.play()

// メディアの再生を一時停止
playerWrapper.pause()

// 特定の時間にシーク
let time = CMTime(seconds: 60, preferredTimescale: 1)
playerWrapper.seek(to: time)


ObserverによるAVPlayer実行中の処理の制御

AVPlayerではDelegate処理などは用意されておらず
ObserverによってAVPlayerの実行状態を検知し処理を行うことができます。

メディアの再生中に定期的な更新(TimeObserverToken)

timeObserverTokenは、メディアの再生中に定期的な更新を提供するために使用されるコンポーネントです。これは、AVPlayerのaddPeriodicTimeObserver(forInterval:queue:using:)メソッドを通じて設定され、指定された時間間隔ごとにブロックを実行します。このブロック内では、現在の再生時間を取得したり、UI(例えば、現在の再生時間を表示するラベル)を更新することができます。

この機能は、ユーザーがメディアの再生状態をリアルタイムで視覚的に把握できるようにするため、特に長いメディアファイルの再生や、ユーザーが再生進行状態を細かく制御したい場合に有効です。

    public func addPeriodicTimeObserver(interval: CMTime, queue: DispatchQueue?, using block: @escaping (CMTime) -> Void) {
        timeObserverToken = player.addPeriodicTimeObserver(forInterval: interval, queue: queue, using: block)
    }

メディアの再生が終了したことを検出(ItemDidPlayToEndObserver)

itemDidPlayToEndObserverは、メディアの再生が終了したことを検出するために使用されるコンポーネントです。これはNotificationCenterを通じて、AVPlayerItemDidPlayToEndTime通知に対するオブザーバーを設定することで実現されます。メディアが最後まで再生されると、この通知が発行され、オブザーバーに登録されたブロックが実行されます。この機能は、メディアの再生が完了した後に特定のアクションを自動的に実行する必要がある場合(例えば、再生位置をメディアの開始位置にリセットする)に便利です。

    private func setupEndPlaybackObserver() {
        itemDidPlayToEndObserver = NotificationCenter.default.addObserver(
            forName: .AVPlayerItemDidPlayToEndTime,
            object: player.currentItem,
            queue: .main) { [weak self] _ in
                self?.player.seek(to: CMTime.zero)
                self?.player.pause()
            }
    }

まとめ

AVPlayerの基本的な処理を見てきました。
今回のコードは下記にまとめてありますので確認してください。
https://github.com/entaku0818/AudioMaster

Discussion