はじめに
この記事はiOSでAVと向き合うシリーズの第二回になります。
前回はAVFoundationとAVKitの差についてを紹介しました。
今回はAVKitのAVPlayerViewControllerを利用して、動画を再生・各種フィールドやメソッドの動作検証を行います。
本シリーズのゴール
読者の皆様にiOSでAVの再生と作成を行うための基礎と取っ掛かりをインプットし、アプリケーションの開発時に困らなくなることをゴールとします。
前提
- 前回までの記事をある程度見ている
本記事のゴール
- AVKitのAVPlayerViewControllerで動画が再生できる
- AVKitのAVPlayerViewControllerの各種フィールドやメソッドの動作が一通り分かる
事前知識
今回からAVFoundationやAVKitの各クラスでWebで配信されている動画を再生することになります。
Webでの動画配信はどうやって行われるかを事前に解説しておきます。
Webでの動画配信方式
Webで動画を配信するにはストリーミングとプログレッシブ方式の2つがあります。
ストリーミング
インターネット上で動画や音声などのコンテンツをダウンロードしながら逐次再生する方式です。
サーバーから映像や音声データが少しずつ配信され、受信した側で同時に再生します。
ネットワークへの負担が少なく、ダウンロードによる待ち時間が少ないこと、多帯域で動画が配信されている場合は通信状況によって帯域を変えながら再生できるなどがメリットとしてあります。
デメリットとして通信速度によって動画が途切れてしまう・音飛びする、配信側には多数の設備や仕組みが必要なことなどが挙げられます。
プログレッシブ
インターネット上から動画をダウンロード完了させてから再生する方式です。
メリットとしては、一度ダウンロードが完了すればネットワークの状況によらず再生が完了できる点、配信側に専用の仕組みが不要な点があります。
デメリットとしてはネットワークへの負担が大きい点、原則ダウンロードが完了するまで動画は再生できない点が挙げられます。
図に表すと、以下のようになります3。
本記事でプログラムの動作検証に利用する動画は、ストリーミング形式の一種であるHLSで配信されている動画4を利用します(Appleがサンプルとして配信している物になります)。
https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_16x9/bipbop_16x9_variant.m3u8
AVPlayerViewControllerで動画を再生する
今回は前述の通り、HLSの動画を再生するサンプルを作ってみます。
参考文献5のサンプルコードが分かりやすいので、これを参考にしましょう。
UIView内にButton、TableViewやCollection ViewのCell等にアクションを設定し、以下ソースコードを追加してください。
guard let url = URL(string: "http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8") else {
return
}
// iOSでAVの情報を管理するためのモデルクラス
// AVの参照先URL、作成日、尺の長さなどが取得できる
let asset = AVAsset(url: url)
// 動画の表示状態や状況を管理するためのモデルクラスを生成
// 再生時間、再生状態(未定義・準備完了・エラー)、バッファリング済みの動画尺などの取得ができる
let playerItem = AVPlayerItem(asset: asset)
// AVの再生や停止、ミュートやアンミュート、ボリューム変更など各種AV操作を行うプレイヤークラス
// AVPlayerは再生したいAVPlayerItemをセットして行う
let player = AVPlayer(playerItem: playerItem)
// AVPlayerViewControllerを生成する
let controller = AVPlayerViewController()
// AVPlayerViewControllerに予め生成しておいたAVPlayerをセットする
controller.player = player
// AVPlayerViewControllerに遷移する
present(controller, animated: true) {
// AVの再生を行う
player.play()
}
プログラムの詳細な説明や各種UIの説明は次回以降で行います。