AVPlayerViewControllerは、Appleエコシステムに組み込まれたビデオプレーヤーコントローラーであり、iOSおよびtvOSでメディアコンテンツを再生するために設計されています。カスタムUIを作成する必要なく、フルスクリーンインターフェース、コントロール、字幕サポート、AirPlayを提供します。Apple Developerドキュメント(2026年)によると、AVPlayerViewControllerは数行のコードで統合でき、HLS、MP4、およびほとんどのメディア形式をサポートしています。
主なポイント
AVPlayerViewControllerは、Appleアプリケーションでビデオを再生するための既製インターフェースを提供するAVKitフレームワークのコンポーネントです。ゼロからカスタムプレーヤーを作成する必要がなくなり、再生/一時停止、スクラビング、音量調整、フルスクリーンモードなどの標準コントロールを提供します。
手動でのUI構築が必要な低レベルのAVPlayerLayerとは異なり、AVPlayerViewControllerはプレーヤーのライフサイクルを完全に管理します。コントローラーは自動的に画面の回転を処理し、ノッチ付きiPhoneのセーフエリアに適応し、iPadでのマルチタスクをサポートします。
Appleドキュメント(2026年)によると、AVPlayerViewControllerはAVPlayerおよびAVQueuePlayerと互換性があり、単一ファイルとプレイリストの両方を再生できます。ローカルストレージのURL、HLSネットワークストリーム、暗号化されたFairPlayコンテンツがサポートされています。
このコンポーネントはiOS 8でAVKitとともに、非推奨のMPMoviePlayerControllerの代替として登場しました。iOS 11では、Picture in Pictureと字幕表示のサポートが追加されました。iOS 14では、コントローラーがAVPlayerViewControllerDelegateを通じてカスタマイズ可能なトランスポートバーを獲得しました。iOS 16以降、プレーヤーを再作成せずにメディアファイルを動的に置き換えるサポートが導入されました。
最新のAVPlayerViewControllerはProMotionディスプレイ向けに最適化されており、ビデオフレームレートが自動的に画面リフレッシュレートと同期します。tvOSでは、コンポーネントがSiri Remoteのフォーカスインターフェースに適応し、macOSではQuickTime Playerのウィンドウモードに適応します。
コントローラーの核心はAVPlayerとAVPlayerItemのペアリングです。AVPlayerはタイムライン、速度、状態を管理する再生オブジェクトです。AVPlayerItemは特定のメディアファイルをラップし、メタデータ、トラック、読み込み情報を含みます。
初期化されると、AVPlayerViewControllerはAVPlayerへの参照を受け取り、ビデオ表示用のAVPlayerLayerを自動的に作成します。コントローラーは、readyToPlay、読み込みエラー、再生完了などの状態変更に関するAVPlayerのKVO通知を購読します。
コントロール(トランスポートバー)はタップ時に表示されます。iOS 15+では、AVPlayerViewControllerCustomizationDelegateを通じてカスタマイズをサポートし、標準ボタンを非表示にしたり置き換えたりできます。
コントローラーを作成してAVPlayerを割り当てた後、viewDidLoadメソッドが呼び出され、ビデオストリームの準備を開始します。AVPlayerItemがAVPlayerItemStatusReadyToPlay状態に移行すると、プレーヤーはフレームを表示する準備が整います。play()メソッドが呼び出されると、Video Toolboxを介してビデオストリームのデコードが開始されます。
画面から離れると、コントローラーは自動的に再生を一時停止し、デコーダーリソースを解放します。iOS 13+でアプリを最小化した際に再生を維持するには、バックグラウンドモードとオーディオセッションを設定する必要があります。WWDC 2024によると、iOSメディアセンターとの同期にはAVPlayerPlaybackCoordinatorを使用することを推奨しています。
このコンポーネントはすぐに使える豊富な機能セットを提供し、ほとんどのプロジェクトにとって魅力的です。以下は、追加コードを必要としない主要な機能です。
トランスポートバーは、メインのコントロールボタンを含むインターフェースの下部です。デフォルトでは、ユーザーが操作しない状態が3秒続くとバーは非表示になり、タップすると表示されます。iOS 16+では、デリゲートを使用して個々の要素の表示を制御できます。
デバッグモードでは、AVPlayerViewController.requiresLinearPlaybackプロパティを使用してトランスポートバーを強制的に表示できます。これにより、ビデオの一時停止も防止されます。これは広告や教育コンテンツに便利です。
コントローラーの基本統合は10行のコードもかかりません。まず、メディアファイルのURLでAVPlayerインスタンスを作成し、それをAVPlayerViewControllerに渡して、コントローラーを画面に表示します。
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()の呼び出し後に自動的に再生が始まります。
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に設定すると、トランスポートバーが完全に非表示になり、ビデオストリームのみが残ります。カスタムオーバーレイ要素に便利です。
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による字幕スタイリングのサポートが導入されました。
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が目的の言語コードと一致するバリアントを検索します。これにより、多言語コンテンツのアプリで「オリジナル音声」機能を実装できます。
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ポイント以上である必要があります。
よくある質問
いいえ、YouTubeビデオにはウェブビューのWKWebViewまたはYouTube iOS Helperライブラリが必要です。YouTubeは独自のDRMシステムを使用しているためです。AVPlayerViewControllerはURLを介した直接メディアストリーム向けに設計されています。
showsPlaybackControlsプロパティをfalseに設定します。その後、画面は空のままになります(ビデオストリームのみ)。カスタムボタンを戻すには、コントローラーの上にaddSubviewでオーバーレイを追加します。
はい、コントローラーはHLS Liveを完全にサポートしています。トランスポートバーには進行状況スライダーの代わりにライブインジケーターが表示されます。レイテンシーはHLS設定によって異なります(低遅延設定で最小6秒)。
AVPlayerItem.statusプロパティでKVOを購読します。エラーが発生すると、ステータスが.failedに変わります。AVPlayerItemのerrorプロパティから詳細を取得し、問題を説明するアラートをユーザーに表示します(多くの場合、ネットワークの問題か無効なURLです)。
はい、カスタムAVAssetResourceLoaderを使用したAVAssetを使用して、RAMからデータを供給できます。AVAssetResourceLoaderDelegateを実装し、ディスクから読み取る代わりにバッファからバイトを返します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。