AVFoundationのノート:関係クラスの役割整理/動画読み書きの基本情報 ほか
WWDC11 415 “Working with Media in AV Foundation - Overview and best practices”
AVFoundationによるメディアの取り扱いの基礎知識を解説しているWWDCセッション。
WWDC11のセッションアーカイブは表向きには見つかりにくくなってしまっているが、Appleのサーバにはまだデータが残っているので、Apple Developer Programに加入しているApple IDでログインすれば手に入れることができる。
- WWDC11 415 - Working with Media in AV Foundation - Overview and best practices (HD, m4v)
- 同スライドデータ(PDF)
WWDC15 506 “Editing Movies in AV Foundation”
AVMovieを使用して動画編集するための基本を解説しているWWDCセッション。
WWDC14 513 “Direct Access to Video Encoding and Decoding”
AVFoundationとVideo Toolboxを使ってハードウェアアクセラレートを効かせたエンコード/デコード処理を実装する方法。
WWDC21 10090 “Decode ProRes with AVFoundation and VideoToolbox”
AF FoundationとVideo Toolboxを使ってApple ProResコーデックのメディアをデコードする方法。
WWDC20 10008 “Optimize the Core Image pipeline for your video app”
ビデオコンテンツにCore Imageパイプラインを適用する方法。Metal Shading Languageを使ったフィルタの作成方法。
AVFoundationの関連クラス
AVFoundationのクラスの役割を簡単に整理しました。元は動画編集用途で調査していたため、一部のオーディオ系、AVCaptureSession(キャプチャセッション)系、AVCapturePhoto(カメラキャプチャ)系などは記載が抜けています。
詳しい用途は公式ドキュメントを確認してください。
アセット関連
メディアはアセットで抽象化されます。
-
AVAsset
- アセットはアセットトラック (AVAssetTrack) のコンテナになるもの
- 具体的なメディアの形式(コーデック)を気にせずに抽象化される
- アセットトラック (AVAssetTrack) を複数抱えることがあるが、アセットの初期化時にすべてのトラックが読み込まれるわけではない
-
AVComposition
- 複数のアセット(音声、映像、字幕トラックなど)をひとまとめにしたメディアを表象する
- 動画編集の場合はこれを利用する
-
AVMutableComposition
- MutableなAVComposition
- 実際の編集処理ではこちらを使用すると思われる
-
AVURLAsset
- ローカルまたはリモートのメディアを表象する
-
AVPlayerItem
- 再生中のアセットを表象するAVPlayer用のアセット
- AVAssetに対応する
- 複数のAVPlayerItemTrackを抱える
QuickTimeムービー関連
-
AVMovie
- AVAssetがサポートしていないQuickTimeムービー操作を行える
- ムービーヘッダを操作したり、QuickTime参照ムービーを作成したりできる
- AVCompositionとの違いは、AVMovieの方が伝統的なQuickTime APIに近い機能が実現可能らしい
- 参考: “Hardware Audio Encoding, AVMovie Brings Back QuickTime Features”
- 参考: “WWDC15 506 - Editing Movies in AV Foundation”
-
AVMutableMovie
- 編集可能なAVMovie
QTKitとAVFoundationの機能とAPIの対応
Technical Note TN2300 - Transitioning QTKit Code to AV Foundation
トラック関連
-
AVAssetTrack
- ビデオ、オーディオ、字幕、タイムコードなどのトラックを表象する
- メディア種別ごとに個別のトラックで表される
- メディア種別は
mediaType
プロパティで判別する -
AVCompositionTrack
- トラックの切り貼りをする際などに利用する高レベルなAPI
- AVCompositionと合わせて利用する
-
AVMutableCompositionTrack
- 実際の編集処理ではこちらを使用すると思われる
-
AVAssetTrackSegment
- アセットトラックの時間範囲を表象する
- 実際にAVAssetTrackを構成する部品
- 参考: “WWDC11 415 - “Working with Media in AV Foundation - Overview and best practices”
-
AVCompositionTrackSegment
- AVCompositionTrackにマッピングするためのAVAssetTrackSegmentサブクラス
-
AVPlayerItemTrack
- 再生中のアセットトラックの状態を表象する
- AVAssetTrackに対応する
プレイヤー関連
-
AVPlayer
- AVAssetを再生する仕組み
- このクラスだけではUIを持たない
-
AVPlayerLayer
- AVPlayerを表示するためのCALayerサブクラス
-
AVPlayerItem
- 再生中のアセットを表象するAVPlayer用のアセット
- AVAssetに対応する
- 複数のAVPlayerItemTrackを抱える
-
AVPlayerItemTrack
- 再生中のアセットトラックの状態を表象する
- AVAssetTrackに対応する
-
AVAudioPlayer
- オーディオプレイヤー。オーディオファイルやバッファから再生を行う
- https://developer.apple.com/documentation/avfaudio/avaudioplayer
-
AVMIDIPlayer
- MIDIプレイヤー。MIDIデータと音源ファイルからMIDIの再生を行う
- https://developer.apple.com/documentation/avfaudio/avmidiplayer
-
AVAudioSession
- アプリケーションでオーディオを扱うための設定やシステムとの相互作用を制御する
- https://developer.apple.com/documentation/avfaudio/avaudiosession
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と合わせて使う
ビデオ関連
-
AVVideoComposition
- ビデオフレームのピクセルバッファーを処理するためのクラス
-
AVMutableVideoComposition
- AVAsynchronousCIImageFilteringRequestでビデオフレームにCIFilterを適用できる
- AVVideoCompositionInstruction
-
AVVideoCompositionLayerInstruction
- コンポジションのトラックにアフィン変換を適用したり、透過度を変更したり、ランプを適用したりする
- AVVideoCompositionInstructionと合わせて使う
オーディオ関連
-
AVFAudio
- AVFoundationのうち、オーディオ関連のクラス群(再生、録音、処理系)をまとめたフレームワーク
- https://developer.apple.com/documentation/avfaudio
-
AVAudioPlayer
- オーディオプレイヤー。オーディオファイルやバッファから再生を行う
- https://developer.apple.com/documentation/avfaudio/avaudioplayer
-
AVMIDIPlayer
- MIDIプレイヤー。MIDIデータと音源ファイルからMIDIの再生を行う
- https://developer.apple.com/documentation/avfaudio/avmidiplayer
-
AVAudioRecorder
- オーディオを録音してファイルに書き出す
- https://developer.apple.com/documentation/avfaudio/avaudiorecorder
-
AVAudioSession
- アプリケーションでオーディオを扱うための設定やシステムとの相互作用を制御する
- https://developer.apple.com/documentation/avfaudio/avaudiosession
-
AVAudioEngine
- オーディオノード(AVAudioNode)のグラフを使ってリアルタイムに再生制御を行う
- https://developer.apple.com/documentation/avfaudio/avaudioengine
-
AVAudioMix
- オーディオトラックのミキシングを行う
- 参考: “WWDC11 415 - “Working with Media in AV Foundation - Overview and best practices”
-
AVAudioMixInputParameters
- オーディオのミキシングの際のパラメータを表す
-
AVAssetReader
- 用途の例
- オーディオの波形を描画する
- オーディオをリニアPCMのデータに変換して読み込む
- 用途の例
Core Animation関連
-
AVVideoCompositionCoreAnimationTool
- ビデオコンポジションにCore Animationレイヤーを合成する際に使う
- CALayer / CAAnimationがビデオ再生と同期的に描画されるようになる(ビデオのタイムラインでアニメーション描画される)
- 参考: “WWDC11 415 - “Working with Media in AV Foundation - Overview and best practices”
ユースケース
ピクセルバッファーを読み込んで処理する
参考:https://www.slideshare.net/rydermackay/avfoundation-tacow-2013-05-14
リアルタイム処理用途
カメラの映像や再生中のムービーに何かを合成するなど
AVCaptureVideoDataOutput
AVPlayerItemVideoOutput
オフライン処理用途
重たい変換処理など
AVAssetReaderTrackOutput
AVAssetReaderVideoCompositionOutput
ビデオのフレームごとにCIFilterを適用する
AVMutableVideoComposition
+ AVAsynchronousCIImageFilteringRequest