iOSでAVと向き合う Vol.2 AVKitで動画を再生する

# はじめに
この記事はiOSでAVと向き合うシリーズの第二回になります。
[前回](https://qiita.com/falcon0328/items/9373a5008df64f9608b4)はAVFoundationとAVKitの差についてを紹介しました。

今回はAVKitのAVPlayerViewControllerを利用して、動画を再生・各種フィールドやメソッドの動作検証を行います。

# 本シリーズのゴール
読者の皆様にiOSでAVの再生と作成を行うための基礎と取っ掛かりをインプットし、アプリケーションの開発時に困らなくなることをゴールとします。

# 前提
- [前回](https://qiita.com/falcon0328/items/9373a5008df64f9608b4)までの記事をある程度見ている

# 本記事のゴール
- AVKitのAVPlayerViewControllerで動画が再生できる
- AVKitのAVPlayerViewControllerの各種フィールドやメソッドの動作が一通り分かる

# 事前知識
今回からAVFoundationやAVKitの各クラスでWebで配信されている動画を再生することになります。
Webでの動画配信はどうやって行われるかを事前に解説しておきます。

## Webでの動画配信方式
Webで動画を配信するにはストリーミングとプログレッシブ方式の2つがあります。

### ストリーミング
インターネット上で動画や音声などのコンテンツをダウンロードしながら逐次再生する方式です。
サーバーから映像や音声データが少しずつ配信され、受信した側で同時に再生します。

ネットワークへの負担が少なく、ダウンロードによる待ち時間が少ないこと、多帯域で動画が配信されている場合は通信状況によって帯域を変えながら再生できるなどがメリットとしてあります。
デメリットとして通信速度によって動画が途切れてしまう・音飛びする、配信側には多数の設備や仕組みが必要なことなどが挙げられます。

### プログレッシブ
インターネット上から動画をダウンロード完了させてから再生する方式です。

メリットとしては、一度ダウンロードが完了すればネットワークの状況によらず再生が完了できる点、配信側に専用の仕組みが不要な点があります。
デメリットとしてはネットワークへの負担が大きい点、原則ダウンロードが完了するまで動画は再生できない点が挙げられます。

詳細は参考文献[^1][^2]などを参照のこと。

図に表すと、以下のようになります[^3]。
![stream_0201.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146605/556b5103-015f-e741-5d99-490c1466e3c0.gif)

本記事でプログラムの動作検証に利用する動画は、ストリーミング形式の一種である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等にアクションを設定し、以下ソースコードを追加してください。

```swift
        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()
        }
```

こんな画面が表示されて、動画の再生が開始されれば成功です。
<img width="187.5" alt="Simulator Screen Shot - iPhone 8 - 2019-09-23 at 23.17.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146605/045fe12a-fc1c-9a8c-ac0e-7124ab49712d.png">

プログラムの詳細な説明や各種UIの説明は次回以降で行います。

# 参考文献
[^1]: [ストリーミング](https://kotobank.jp/word/ストリーミング-4964)
[^2]: [ネット動画の配信方式：ストリーミングとプログレッシブダウンロードとは？](https://blog.socialcast.jp/05/post-15/)
[^3]: [HPで使える画像（ストリーミング）について](http://www.ccjc-net.or.jp/~kouza/stream/stream02.html)
[^4]: [Streaming Examples](https://developer.apple.com/streaming/examples/)
[^5]: [iosの動画再生周りの基礎を調べた](https://qiita.com/yakimeron/items/34a65397c1041c0b2a0c)