iOSでAVと向き合う Vol.1 基本編

# はじめに
Appleプラットフォーム（iOS/macOS/tvOS）ではオーディオビジュアル（AV）の再生と作成を``AVFoundation``[^1] [^2]や``AVKit``[^3]というFrameworkで実現しています  。

今回からドキュメントの内容を翻訳・写経したり、先駆者の記事を読み解きつつこれらのFrameworkについてまとめていきたいと思います。

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

## この回でのゴール
次回以降の説明に備え、AVFoundationやAVKitの概要を知ること

# 本シリーズの対象者
本シリーズの対象者は以下のスキルセットを持ち、iOSでAVを再生したり作成したりについて興味がある方が対象です。
- iOSアプリの開発を行ったことがある
- Swift/Objective-Cがある程度分かる人

# 注意
- 本シリーズでは主にiOSに限定して話を展開します。
- 本シリーズで出てくる単語 AVとは = オーディオビジュアル = ビデオ、音声・音楽のことです

# iOS上でAVを取り扱うためには
iOSでは以下のようなアーキテクチャでAVを取り扱います。それぞれの四角形がFrameworkとなっています。
AVFoundationではCore Audio、Core Media、Core AnnimationのFrameworkを活用してAVの各種操作を可能にしています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146605/c4e41d2a-314b-9303-0b25-00e7323993f3.png" width="75%" />

## Core ~~ Framework
Core ~~~ と名前の付いたFrameworkでそれぞれメディアの低レベルレイヤでの処理（映像や音声へのバイトデータ操作など）や処理で利用するデータ型を提供しています。

### Core Media
AV処理で欠かせない各種[パイプライン処理](https://ja.wikipedia.org/wiki/パイプライン処理)と処理で利用するデータ型を定義しています[^4]。具体的には、Core Media でAVの各フレームでのピクセルデータ、音声の波形データなどを参照・操作することが可能になります。

### Core Audio
音声を処理するために必要なデータ型を定義し、それらはオーディオ関係の処理でハードウェアとのやり取りに使用することができる[^5]。

### Core Animation
Viewやその他の画面に表示されるような要素をアニメーションさせるために使われるグラフィックの描画やそれに必要なデータ型を定義したFrameworkになります[^6]。

つまり、AVの再生時においてCore Mediaで処理した各ピクセルデータを端末内のオンボードグラフィックスハードウェア（いわゆるGPU部分）に渡されてアニメーションとしてView内に表示します。

## AVFoundationとは
AVFoundationは、AVの再生と作成に使用できるフレームワークで、AVに関する作業を細かいレベルで行うためのインタフェースを提供してくれます。たとえば、メディアファイルの再生、検査、作成、編集、再エンコードなどができます。他にも、デバイスから入力ストリームを取得して、リアルタイムでキャプチャ中 および再生中のビデオを操作することもできます。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146605/c2628ee0-add8-3b01-5951-57b188c8b062.jpeg" />

ざっくり言ってしまうと、iMovieの各種機能がプログラムから呼び出せるイメージです。

## AVKit
AVFoundationの機能にUIKit内で定義されているコンポーネントをもとにUIを与え、それらを呼び出せるようにしているFrameworkです。AVを再生したい、UIの用意は自分でしなくでもOSデフォルトのUIが与えられれば良いといった方のためのものです。

ユーザーコントロール、チャプター操作、字幕やクローズドキャプションのサポート、再生ルート選択機能を備えたメディア再生用のUIを提供してくれます。AVの操作や編集は未対応です。加えて、再生時のUIは決まったものが提供される関係上カスタマイズできる余地も少ないです。

<img width="30%" alt="avplayercontroller.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146605/18af7a14-af51-eaba-de5a-9e245a6d3b41.png">[^7]
<img width="75%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146605/abe5d989-854a-2350-cdea-4decaecf0ecf.png">[^8]
<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146605/ebfcfbd7-2963-bfdf-18db-4a46a5df340d.png">[^9]

# まとめ
基本的にはiOS上でAVを取り扱っていく際は、AVFoundationを学んでいくのが最初は良いと思います。

AVを再生したいだけで、UIのカスタマイズはあまり考えてない、その他の機能も要件的に必要ない場合はAVKitを勉強して利用すると簡単で良いかと思います。

次回はAVメディアの再生に重きを置き、サンプルプログラムを実装しつつ理解を深めていきましょう。
[その2](https://qiita.com/falcon0328/items/fb57ddd56db412013ea1)へつづく

# 参考文献
[iosの動画再生周りの基礎を調べた](https://qiita.com/yakimeron/items/34a65397c1041c0b2a0c)
[AVPlayerについて調べた](https://masegi.hatenablog.com/entry/2019/02/18/090034)

[^1]: [AVFoundation](https://developer.apple.com/documentation/avfoundation)
[^2]: [AVFoundation Programming Guide](https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/00_Introduction.html)
[^3]: [AVKit](https://developer.apple.com/documentation/avkit)
[^4]: [Core Media](https://developer.apple.com/documentation/coremedia)
[^5]: [【iOS】 Core Animationまとめ](https://qiita.com/shiz/items/10cb712a26620f2e3bdc)
[^6]: [iOSのオーディオまわり(CoreAudio)まとめ](https://qiita.com/Kta-M/items/ae892ca159186045e95d)
[^7]: [AVPlayerViewController vs. AVPlayerLayer](https://hsue66.github.io/2017/11/08/AVPlayerViewController-vs.-AVPlayerLayer/)
[^8]: [Picture in Picture(iOS9)](https://qiita.com/noppefoxwolf/items/71ab597a538ffab7163e)
[^9]: [Is it possible to enable airplay mirroring programmatically?](https://stackoverflow.com/questions/38045488/is-it-possible-to-enable-airplay-mirroring-programmatically)