なんとかするから、なんとかなる

エンジニア関係のことを書きます

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系

  • UIKitFrameworkのインターフェースでiOS用(MacOSXでは使えない)
  • MacOSX様にはAppKitFramework (NSImageなど)

CGxxx系

  • CoreGraphicsFrameworkのインターフェース iOSでもMacOSXでも使える。

参考URL

次のサイトに本当に助けられました。