[Xcode/Swift] AVFoundation完全理解への道①

1. はじめに

1.1 AVFoundationとは?

AVFoundation = iOSで映像・音声を操りたいときに最強なツール
Apple純正の超強力なメディアフレームワーク。

具体的にできること:

  • 🎥 動画再生(AVPlayerとか)
  • 🎙 音声の再生・録音(AVAudioPlayer / AVAudioEngine)
  • 📸 カメラ・マイクでの録画・録音(AVCaptureSession)
  • 🛠 メディア編集・処理(AVAssetWriter / Reader)

1.2 この記事でできるようになること、対象読者

できるようになること:

  • ✅ AVPlayerでHLS動画をスマートに再生できる
  • ✅ AVCaptureで録画・録音がサクッとできる
  • ✅ AVFoundation特有のバグ地獄を事前に回避
  • ✅ 実務でも使える再生UIやTipsをマスター
  • ✅ SwiftUIとの組み合わせもできる

対象読者:

対象読者(初心者〜中級者)

  • AVFoundationって名前だけ聞いたことあるレベル
  • AVPlayerで動画流したけど、シークとかKVOで詰まった人
  • 実務でカメラ使ったけど、バグ処理が辛かった人
  • SwiftUIでAVFoundationをうまく扱いたい人

コードもできるだけシンプル & 最小構成で作成、
「まだなんとなくでしか理解できてないかも」って人でも安心してOK。

* 読者に男子中学生はいないと思いますが、AV = Audio Visualなので変に期待しないでください。


2. AVFoundationの全体像

AVFoundation = 使いこなせれば最強
だけど最初は「何から手をつけていいかわからん」ってなるやつ。

なのでまずは、全体の構造をマッピングしてみる。

2.1 映像系 → AVPlayer / AVPlayerItem / AVAsset

動画の再生で使うのがこいつら:

  • AVAsset: メディアファイルの**情報(メタデータやトラック)**を表す土台。URLベースで初期化。
  • AVPlayerItem: AVAssetを再生用の部品に変換したもの。再生時間やバッファの状態もここに集約されてる。
  • AVPlayer: プレイヤー本体。こいつが再生・停止・シークを司る。

AVAsset → AVPlayerItem → AVPlayerの流れ

2.2 音声系 → AVAudioPlayer / AVAudioEngine

音を鳴らす or 自由に操るならこいつら:

  • AVAudioPlayer: シンプルに音声ファイル(.mp3, .m4aなど)を再生するだけならこれ。再生・停止・ループが楽。
  • AVAudioEngine: 音をもっと自由にいじりたい(ミキシング、エフェクト、リアルタイム処理)ならこれ。(設定は少し複雑)

ポイント:
✅ AVAudioPlayer = 簡単便利な再生用
✅ AVAudioEngine = プロ級の音声処理用

って覚えておけばOK。

2.3 録音・録画系 → AVCaptureSession / AVCaptureDevice

カメラとマイクを支配するキャプチャ系:

  • AVCaptureDevice: カメラやマイクといった「物理的なデバイス」そのもの。
  • AVCaptureSession:「入力(カメラ/マイク) → 出力(ファイル/画面)」の配線・制御センター。(セッションの設定次第で、録音・録画・ライブプレビューなんでも可能。)

ポイント:
✅ カメラやマイクの実体 = AVCaptureDevice
✅ それをどう繋いで使うか決めるか = AVCaptureSession

って覚えておけばOK。

2.4 メディア処理系 → AVAssetWriter / AVAssetReader

動画・音声を読み書き・編集するメディア系:

  • AVAssetReader: AVAssetから生のデータ(ピクセルや音声バッファ)を読み出す
  • AVAssetWriter:読み出したデータをファイルに書き込む(エンコードして保存)

ポイント:
✅ 動画・音声の編集やカスタム録画 = AVAssetWriter / AVAssetReader
✅ 編集アプリや高度な録画機能はこいつらの上に成り立ってる。

って覚えておけばOK。


という感じで、AVFoundationは用途ごとに明確な担当パートがある

この構成を理解してると、
「これはAVPlayerの出番だな」とか「AVCaptureでやれそうだな」って判断ができるようになるのでVery Good。

一個の記事でまとめると膨大な説明とサンプルコードになりそうなので、続きは以下記事に進んで学んでいきましょう。