iOSでTimelapse動画作成アプリを作ったときに利用したFrameworkおよびライブラリのまとめ
以前にTimelapse動画を作成 iOSアプリを作成したことがあったので、そのまとめです。
使用したFrameworkおよびライブラリ
AVFoundation
AVAsset
- 1つ以上のメディアデータのコレクションを集約したもの
- コレクションのタイトル、再生時間、本来の表示サイズなどコレクションに関する情報が保持されている
AVAssetWriter
- 直訳して「ビデオ資産を書き込むもの」
- 保存先とfileTypeを指定する
AVAssetWriterInput
- AVAssetWriterにAddする
- コーデックや高さ、幅を指定
AVAssetWriterInputPixelBufferAdaptor
- CVPixelBufferRefでデータを受けておるために使用
AVMutableComposition
- 動画等の合成処理本体
AVMutableCompositionTrack
- トラック情報
AVMutableAudioMix
- 音声の合成処理
AVMutableAudioMixeInputParameters
- 音声の情報
CMSampleBuffer
- ビデオデータやそれに関連するメタデータが格納されている
CVPixelBuffer
- ピクセルイメージ
- PixerlBufferの生成は次の通り
CVPixelBufferCreate(allocator, width, height, pixelFormatType, pixelBufferAttributes, pixelBufferOut);
- allocator: メモリの解放や確保のやり方を保持
- width: そのままBufferのサイズを保持
- pixelFormatType: ピクセルの表現の仕方を指定
- pixelFormatAttributes: ピクセルバッファに対するオプション。CGImageなどに対応できるかを指定
- pixelBufferOut: 作られたピクセルバッファ
CVPixelBUfferLockBaseAddress
- 処理中に書き換えられない様にロックする
- 第2引数はフラグ、Raed_Onlyまたは0で指定
CVColorSpaceRaf
- カラー空間(RGBやCMYK, grayscaleなど)を指定
Graphics Context
- 描画先を指定するもの(画面だったり、ビットマップだったり、PDFだったり)
CGContextの描画位置について
CGContextTranslateCTM
- 描画座標の移動
CGContextScaleCTM
- 大きさの変更
- ScaleでContext全体の大きさをかえるので、ContextTranslateの位置が変わる
CGContextSaveGState
- 現在のContextの状態を保存
CGContextRestoreGState
- 保存したContextの状態を復元
GPUImage
- フィルター処理に使用
CMTime構造体
CMTime time = CMTimeMake(value, timescale);
- valueで指定した値のうちtimescaleは1秒あたりのvalueの大きさを示す
- valueをtimescaleで割ったのが秒
- 多くのサンプルではtimescale = 600が多い
- 0はkCMTimeZeroで表現する
ファイルシステムについて
iOSデバイスのディレクトリパスの取得方法
NSArray *paths = NSSearchPathForDirectoriesInDomains();
- cachesディレクトリ・・・アプリがアクティブでも削除されることがある
- tmpディレクトリ・・・アプリがアクティブのときは保持される
- Documentsディレクトリ・・・アプリがアンインストールされない限り保持される
NSUserDomainMask
- どこを探すか、ユーザのホームディレクトリから始まる
NSSystemDomainMask
システムディレクトリを探す
expandTitle
- 〜を展開するかどうか。ファイルを書き込むためには展開が必要
Tips
静止画は一度PixelBufferに変換する必要がある
- AVAssetWriterInputPixelBufferAdaptorを利用してCVPixelBufferRefに変換する
画像と動画のサイズについて
- 動画の指定サイズよりも画像が大きい場合、小さい場合どちらも失敗するので、リサイズが必要
UIxxx系やCGxxx系の違い
UIxxx系
CGxxx系
参考URL
次のサイトに本当に助けられました。