AVPlayerViewController:概要とiOSでの統合方法

著者: IT Sectr 公開日: 2026-05-23 読了時間: 8 分

AVPlayerViewControllerは、Appleエコシステムに組み込まれたビデオプレーヤーコントローラーであり、iOSおよびtvOSでメディアコンテンツを再生するために設計されています。カスタムUIを作成する必要なく、フルスクリーンインターフェース、コントロール、字幕サポート、AirPlayを提供します。Apple Developerドキュメント(2026年)によると、AVPlayerViewControllerは数行のコードで統合でき、HLS、MP4、およびほとんどのメディア形式をサポートしています。

主なポイント

  • AVPlayerViewControllerは、iOSおよびtvOS向けAVKitフレームワークの標準ビデオ再生コントローラーです。
  • コントロールバー、再生ボタン、進行状況インジケーターを備えた既製のユーザーインターフェースを提供します。
  • コントローラーは自動的に字幕、オーディオトラック、AirPlay、Picture in Pictureをサポートします。
  • 統合はAVPlayerを介して行われます。これは再生管理のための基本オブジェクトです。
  • 開発者はデリゲートを通じてコントロールの表示をカスタマイズしたり、オーバーレイビューを追加したり、イベントを処理したりできます。

AVPlayerViewControllerとは?

AVPlayerViewControllerは、Appleアプリケーションでビデオを再生するための既製インターフェースを提供するAVKitフレームワークのコンポーネントです。ゼロからカスタムプレーヤーを作成する必要がなくなり、再生/一時停止、スクラビング、音量調整、フルスクリーンモードなどの標準コントロールを提供します。

手動でのUI構築が必要な低レベルのAVPlayerLayerとは異なり、AVPlayerViewControllerはプレーヤーのライフサイクルを完全に管理します。コントローラーは自動的に画面の回転を処理し、ノッチ付きiPhoneのセーフエリアに適応し、iPadでのマルチタスクをサポートします。

Appleドキュメント(2026年)によると、AVPlayerViewControllerはAVPlayerおよびAVQueuePlayerと互換性があり、単一ファイルとプレイリストの両方を再生できます。ローカルストレージのURL、HLSネットワークストリーム、暗号化されたFairPlayコンテンツがサポートされています。

AVPlayerViewControllerの歴史とバージョン

このコンポーネントはiOS 8でAVKitとともに、非推奨のMPMoviePlayerControllerの代替として登場しました。iOS 11では、Picture in Pictureと字幕表示のサポートが追加されました。iOS 14では、コントローラーがAVPlayerViewControllerDelegateを通じてカスタマイズ可能なトランスポートバーを獲得しました。iOS 16以降、プレーヤーを再作成せずにメディアファイルを動的に置き換えるサポートが導入されました。

最新のAVPlayerViewControllerはProMotionディスプレイ向けに最適化されており、ビデオフレームレートが自動的に画面リフレッシュレートと同期します。tvOSでは、コンポーネントがSiri Remoteのフォーカスインターフェースに適応し、macOSではQuickTime Playerのウィンドウモードに適応します。

AVPlayerViewControllerの仕組み

コントローラーの核心はAVPlayerAVPlayerItemのペアリングです。AVPlayerはタイムライン、速度、状態を管理する再生オブジェクトです。AVPlayerItemは特定のメディアファイルをラップし、メタデータ、トラック、読み込み情報を含みます。

初期化されると、AVPlayerViewControllerはAVPlayerへの参照を受け取り、ビデオ表示用のAVPlayerLayerを自動的に作成します。コントローラーは、readyToPlay、読み込みエラー、再生完了などの状態変更に関するAVPlayerのKVO通知を購読します。

コントロール(トランスポートバー)はタップ時に表示されます。iOS 15+では、AVPlayerViewControllerCustomizationDelegateを通じてカスタマイズをサポートし、標準ボタンを非表示にしたり置き換えたりできます。

コントローラーのライフサイクル

コントローラーを作成してAVPlayerを割り当てた後、viewDidLoadメソッドが呼び出され、ビデオストリームの準備を開始します。AVPlayerItemがAVPlayerItemStatusReadyToPlay状態に移行すると、プレーヤーはフレームを表示する準備が整います。play()メソッドが呼び出されると、Video Toolboxを介してビデオストリームのデコードが開始されます。

画面から離れると、コントローラーは自動的に再生を一時停止し、デコーダーリソースを解放します。iOS 13+でアプリを最小化した際に再生を維持するには、バックグラウンドモードとオーディオセッションを設定する必要があります。WWDC 2024によると、iOSメディアセンターとの同期にはAVPlayerPlaybackCoordinatorを使用することを推奨しています。

AVPlayerViewControllerの主な機能

このコンポーネントはすぐに使える豊富な機能セットを提供し、ほとんどのプロジェクトにとって魅力的です。以下は、追加コードを必要としない主要な機能です。

  • トランスポートバー — 再生/一時停止、15秒スキップ、音量コントロール、進行状況スライダー。
  • 字幕サポート — VTT、SRT、iTunes Timed Text形式の埋め込みおよび外部字幕の自動表示。
  • AirPlay — Apple TVやその他のAirPlay対応デバイスへのビデオストリーミング機能。
  • Picture in Picture — 特殊ボタンをタップするとフローティングウィンドウで再生(iPadおよびiOS 14+のiPhone)。
  • フルスクリーンモード — デバイスの回転時および拡大ボタンタップ時の自動切り替え。
  • 速度制御 — 再生速度を選択するための内蔵コントロール(0.5倍、1.0倍、1.5倍、2.0倍)。
  • 保護されたコンテンツ — DRM対応HLSコンテンツ向けFairPlay Streamingのネイティブサポート。

AVPlayerViewControllerのトランスポートバー

トランスポートバーは、メインのコントロールボタンを含むインターフェースの下部です。デフォルトでは、ユーザーが操作しない状態が3秒続くとバーは非表示になり、タップすると表示されます。iOS 16+では、デリゲートを使用して個々の要素の表示を制御できます。

デバッグモードでは、AVPlayerViewController.requiresLinearPlaybackプロパティを使用してトランスポートバーを強制的に表示できます。これにより、ビデオの一時停止も防止されます。これは広告や教育コンテンツに便利です。

プロジェクトへのAVPlayerViewControllerの統合

コントローラーの基本統合は10行のコードもかかりません。まず、メディアファイルのURLでAVPlayerインスタンスを作成し、それをAVPlayerViewControllerに渡して、コントローラーを画面に表示します。

Swiftでの基本プレーヤーの作成

swift
import AVKit

let player = AVPlayer(url: URL(string: "https://example.com/video.mp4")!)
let playerVC = AVPlayerViewController()
playerVC.player = player

present(playerVC, animated: true) {
    player.play()
}

presentを呼び出すと、コントローラーがフルスクリーンで表示されます。ビデオはネットワークから読み込みを開始し、バッファがreadyToPlayしきい値に達すると、play()の呼び出し後に自動的に再生が始まります。

高度な制御のためのAVPlayerItemの設定

swift
let asset = AVAsset(url: videoURL)
let item = AVPlayerItem(asset: asset)

let metadata = AVMutableMetadataItem()
metadata.key = AVMetadataKey.commonKeyTitle
metadata.value = "マイビデオ"
item.addMetadata(metadata)

let player = AVPlayer(playerItem: item)
let playerVC = AVPlayerViewController()
playerVC.player = player

AVPlayerItemを使用すると、メタデータ、タイムコード、オーディオトラックの選択、字幕を制御できます。AVPlayerItemを介して、statusプロパティのKVOを使用して読み込みの進行状況、バッファリング、ネットワークエラーを監視することもできます。

コントロールのカスタマイズ

iOS 11以降、開発者はAVPlayerViewControllerDelegateプロトコルを通じてトランスポートバーをカスタマイズできます。playerViewController(_:willBeginFullScreenPresentationWithAnimationCoordinator:)メソッドはフルスクリーンモードに入る前に呼び出され、UIを準備できます。

個々のボタンを非表示にするには、AVPlayerViewController.showsPlaybackControlsプロパティを使用します。falseに設定すると、トランスポートバーが完全に非表示になり、ビデオストリームのみが残ります。カスタムオーバーレイ要素に便利です。

デリゲートを使用したカスタマイズ

swift
class CustomPlayerViewController: UIViewController {
    private let playerVC = AVPlayerViewController()

    override func viewDidLoad() {
        super.viewDidLoad()
        playerVC.delegate = self
        playerVC.showsPlaybackControls = true
        playerVC.entersFullScreenWhenPlaybackBegins = true
    }
}

extension CustomPlayerViewController: AVPlayerViewControllerDelegate {
    func playerViewController(
        _ playerViewController: AVPlayerViewController,
        willBeginFullScreenPresentationWithAnimationCoordinator coordinator: UIViewControllerTransitionCoordinator
    ) {
        // オーバーレイボタンを追加
    }

    func playerViewController(
        _ playerViewController: AVPlayerViewController,
        didUpdate legibleMediaSelection: AVMediaSelectionGroup
    ) {
        print("新しい字幕言語が選択されました")
    }
}

デリゲートは、字幕変更イベント、フルスクリーンモードへの出入り、Picture in Pictureの開始と終了をインターセプトできます。WWDC 2024でAppleは、分析のためにデリゲートを使用し、各遷移を100ミリ秒以内にログ記録することを推奨しました。

字幕とオーディオトラックの操作

AVPlayerViewControllerは、メディアファイルに埋め込まれているかHLSマニフェストで指定されている場合、利用可能なすべての字幕とオーディオトラックを自動的に表示します。ユーザーはトランスポートバーの字幕アイコンをタップすると表示されるメニューから切り替えることができます。

HLSストリームの場合、M3U8マニフェストには利用可能な言語バリアントのリストが含まれています。AVPlayerは対応するWebVTT字幕セグメントを読み込み、レンダリングのためにAVPlayerLayerに渡します。iOS 16+では、AVTextStyleRuleによる字幕スタイリングのサポートが導入されました。

プログラムによるオーディオトラックの選択

swift
func selectAudioTrack(languageCode: String) {
    guard let group = player.currentItem?
        .asset.mediaSelectionGroup(forMediaCharacteristic: AVMediaCharacteristic.audible)
    else { return }

    for option in group.options {
        if option.extendedLanguageTag?.hasPrefix(languageCode) == true {
            player.currentItem?.select(option, in: group)
        }
    }
}

selectAudioTrackメソッドは、audibleグループのオーディオオプションから、extendedLanguageTagが目的の言語コードと一致するバリアントを検索します。これにより、多言語コンテンツのアプリで「オリジナル音声」機能を実装できます。

iPadでのPicture in Picture

Picture in Picture(PiP)モードでは、他のアプリの上にフローティングウィンドウでビデオを表示できます。iPadではiOS 9から、iPhoneではiOS 14からこの機能が利用可能です。AVPlayerViewControllerは、UIBackgroundModesにサブスクライブすると、トランスポートバーにPiPボタンを自動的に追加します。

PiPを有効にするには、Info.plistにaudioおよびairplayの値を持つUIBackgroundModesキーを追加します。その後、コントローラーにPiPボタンが表示され、タップするとビデオが192x108ポイントのフローティングウィンドウに縮小されます。

PiPイベントはデリゲートを通じて処理されます:playerViewController(_:willStartPictureInPictureFromFullScreen:)およびplayerViewController(_:didStopPictureInPicture:)。Apple HIGによると、コンテンツの読みやすさを維持するために、PiPウィンドウの最小サイズは120x68ポイント以上である必要があります。

よくある質問

AVPlayerViewControllerはYouTubeビデオの再生をサポートしていますか?

いいえ、YouTubeビデオにはウェブビューのWKWebViewまたはYouTube iOS Helperライブラリが必要です。YouTubeは独自のDRMシステムを使用しているためです。AVPlayerViewControllerはURLを介した直接メディアストリーム向けに設計されています。

AVPlayerViewControllerのトランスポートバーを無効にするには?

showsPlaybackControlsプロパティをfalseに設定します。その後、画面は空のままになります(ビデオストリームのみ)。カスタムボタンを戻すには、コントローラーの上にaddSubviewでオーバーレイを追加します。

AVPlayerViewControllerはHLSライブストリームで動作しますか?

はい、コントローラーはHLS Liveを完全にサポートしています。トランスポートバーには進行状況スライダーの代わりにライブインジケーターが表示されます。レイテンシーはHLS設定によって異なります(低遅延設定で最小6秒)。

AVPlayerViewControllerでのビデオ読み込みエラーを処理するには?

AVPlayerItem.statusプロパティでKVOを購読します。エラーが発生すると、ステータスが.failedに変わります。AVPlayerItemのerrorプロパティから詳細を取得し、問題を説明するアラートをユーザーに表示します(多くの場合、ネットワークの問題か無効なURLです)。

AVPlayerViewControllerでメモリからビデオを読み込めますか?

はい、カスタムAVAssetResourceLoaderを使用したAVAssetを使用して、RAMからデータを供給できます。AVAssetResourceLoaderDelegateを実装し、ディスクから読み取る代わりにバッファからバイトを返します。

まとめ

  • AVPlayerViewControllerは、最小限の統合コードでiOS、iPadOS、tvOSでビデオ再生を実現する既製のAVKitコンポーネントです。
  • コントローラーはHLS、MP4、保護されたFairPlayコンテンツ、字幕、オーディオトラックをすぐにサポートします。
  • 基本的な使用法としては、AVPlayerを作成してコントローラーに渡すだけで、UIが自動的にレンダリングされます。
  • AVPlayerViewControllerDelegateを使用すると、トランスポートバーのカスタマイズ、PiPや字幕変更の処理が可能です。
  • トランスポートバーは3秒間の非操作で非表示になりますが、showsPlaybackControlsで表示を完全に制御できます。
  • Picture in Pictureを使用するには、Info.plistでUIBackgroundModesのaudioとairplayを有効にする必要があります。
  • エラーが発生した場合は、AVPlayerItem.statusのKVOを使用して詳細を取得し、ユーザーに表示します。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください