Open3

AVFoundationのノート:関係クラスの役割整理/動画読み書きの基本情報 ほか

usagimaruusagimaru

WWDC11 415 “Working with Media in AV Foundation - Overview and best practices”

AVFoundationによるメディアの取り扱いの基礎知識を解説しているWWDCセッション。

WWDC11のセッションアーカイブは表向きには見つかりにくくなってしまっているが、Appleのサーバにはまだデータが残っているので、Apple Developer Programに加入しているApple IDでログインすれば手に入れることができる。

WWDC15 506 “Editing Movies in AV Foundation”

AVMovieを使用して動画編集するための基本を解説しているWWDCセッション。

https://developer.apple.com/videos/play/wwdc2015/506/

WWDC14 513 “Direct Access to Video Encoding and Decoding”

AVFoundationとVideo Toolboxを使ってハードウェアアクセラレートを効かせたエンコード/デコード処理を実装する方法。

https://developer.apple.com/videos/play/wwdc2014/513/

WWDC21 10090 “Decode ProRes with AVFoundation and VideoToolbox”

AF FoundationとVideo Toolboxを使ってApple ProResコーデックのメディアをデコードする方法。

https://developer.apple.com/videos/play/wwdc2020/10090/

WWDC20 10008 “Optimize the Core Image pipeline for your video app”

ビデオコンテンツにCore Imageパイプラインを適用する方法。Metal Shading Languageを使ったフィルタの作成方法。

https://developer.apple.com/videos/play/wwdc2020/10008/

usagimaruusagimaru

AVFoundationの関連クラス

AVFoundationのクラスの役割を簡単に整理しました。元は動画編集用途で調査していたため、一部のオーディオ系、AVCaptureSession(キャプチャセッション)系、AVCapturePhoto(カメラキャプチャ)系などは記載が抜けています。

詳しい用途は公式ドキュメントを確認してください。

アセット関連

メディアはアセットで抽象化されます。

  • AVAsset
    • アセットはアセットトラック (AVAssetTrack) のコンテナになるもの
    • 具体的なメディアの形式(コーデック)を気にせずに抽象化される
    • アセットトラック (AVAssetTrack) を複数抱えることがあるが、アセットの初期化時にすべてのトラックが読み込まれるわけではない
    • AVComposition
      • 複数のアセット(音声、映像、字幕トラックなど)をひとまとめにしたメディアを表象する
      • 動画編集の場合はこれを利用する
      • AVMutableComposition
        • MutableなAVComposition
        • 実際の編集処理ではこちらを使用すると思われる
    • AVURLAsset
      • ローカルまたはリモートのメディアを表象する
  • AVPlayerItem
    • 再生中のアセットを表象するAVPlayer用のアセット
    • AVAssetに対応する
    • 複数のAVPlayerItemTrackを抱える

QuickTimeムービー関連

QTKitとAVFoundationの機能とAPIの対応

Technical Note TN2300 - Transitioning QTKit Code to AV Foundation

トラック関連

  • AVAssetTrack
    • ビデオ、オーディオ、字幕、タイムコードなどのトラックを表象する
    • メディア種別ごとに個別のトラックで表される
    • メディア種別はmediaTypeプロパティで判別する
    • AVCompositionTrack
      • トラックの切り貼りをする際などに利用する高レベルなAPI
      • AVCompositionと合わせて利用する
      • AVMutableCompositionTrack
        • 実際の編集処理ではこちらを使用すると思われる
  • AVAssetTrackSegment
  • AVPlayerItemTrack
    • 再生中のアセットトラックの状態を表象する
    • AVAssetTrackに対応する

プレイヤー関連

UIフレームワーク

  • AVPlayerView (macOS)
    • AVKitで提供される、標準的なUIを備えたプレイヤービュークラス(macOS専用)
    • QuickTime PlayerのようなUIを簡単に再現できる
    • AVPlayer / AVPlayerLayerでプレイヤーを自作する場合は、これを使わなくても良い
  • AVPlayerViewController (iOS+)
    • AVKitで提供される、標準的なUIを備えたプレイヤービューコントローラクラス(iOS, iPadOS, tvOS, Mac Catalyst用)
    • AVPlayer / AVPlayerLayerでプレイヤーを自作する場合は、これを使わなくても良い
    • サブクラス化は許可されていない

I/O関連

  • AVAssetImageGenerator
    • ビデオアセットから静止画を生成するために使う
  • AVAssetExportSession
    • アセットを別の形式に変換する仕組み
    • シンプルに変換処理を実装したい場合に使う
    • 詳細な変換処理を実装したい場合はAVAssetReader + AVAssetWriterで対応する
  • AVCaptureFileOutput
    • キャプチャ用の抽象クラス
    • AVCaptureMovieFileOutput
      • 他のストリームビデオをQuickTimeムービーにキャプチャ(録画)するために使う
    • AVCaptureAudioFileOutput
      • 他のストリームオーディオをキャプチャ(録音)するために使う
  • AVPlayerItemOutput
    • AVPlayerItemからメディアデータを取得するための抽象クラス
    • AVPlayerItemVideoOutput
      • AVPlayerItemのビデオからフレームを取得するために使う
    • AVPlayerItemMetadataOutput
      • AVPlayerItemのメタデータを取得するために使う
    • AVPlayerItemLegibleOutput
      • AVPlayerItemの字幕データを取得するために使う

読み込み

  • AVAssetReader
    • アセットからデータを逐一読み込んで活用する用途で使う
    • リアルタイム系の処理には向かないので、その用途ではAVCaptureVideoDataOutput AVPlayerItemVideoOutputを使う
    • 次の用途には向かない
      • 再生, seeking
      • リアルタイム処理
      • ネットワーク越しの処理
  • AVAssetReaderOutput
    • AVAssetReaderから得られたメディアを読み込むための抽象クラス
    • AVAssetReaderTrackOutput
      • アセットトラックごとにメディアデータを読み込むために使う
      • AVAssetReaderと合わせて使う
    • AVAssetReaderVideoCompositionOutput
      • 合成されたビデオコンポジションを読み込むために使う

書き出し

  • AVAssetWriter
    • 映像データをファイルに書き出す用途で使う
  • AVAssetWriterInput
    • アセットトラックの内容をファイルに書き出す
    • AVAssetWriterと合わせて使う

ビデオ関連

オーディオ関連

Core Animation関連

usagimaruusagimaru

ユースケース

ピクセルバッファーを読み込んで処理する

参考:https://www.slideshare.net/rydermackay/avfoundation-tacow-2013-05-14

リアルタイム処理用途

カメラの映像や再生中のムービーに何かを合成するなど

  • AVCaptureVideoDataOutput
  • AVPlayerItemVideoOutput

オフライン処理用途

重たい変換処理など

  • AVAssetReaderTrackOutput
  • AVAssetReaderVideoCompositionOutput

ビデオのフレームごとにCIFilterを適用する

AVMutableVideoComposition + AVAsynchronousCIImageFilteringRequest
https://developer.apple.com/documentation/avfoundation/avasynchronousciimagefilteringrequest