2010年8月2日月曜日

で、リアルタイムキャプチャ

というわけで、リアルタイムでキャプチャして、そのキャプチャデータのbitmapへアクセスする方法を調べたさ。

これ、Appleがサンプルを出しているんだけど、うちの環境だとちゃんと動かない。
なにがダメかってと、captureOutputメソッド(delegate)で取得したUIImageをそのdelegateの外(メインスレッド)から使おうとすると、データの中身がなくなっているのです。
原因はよくわかんないんだけど、これはdelegateを呼び出すタイミングと外側から使おうとしてオブジェクトへアクセスするタイミングでうまく噛み合わなくてダメなんじゃないかと憶測。delegate内で処理を完結させればいいのかもしれない。

AbrViewerで使うならdelegate内で処理を終わらせればいいんだけど、 別アプリで使おうとしているアイディアではキャプチャしたデータを外側で使いたいから、これじゃダメ。
 なので、いろいろ試行錯誤で実験してみた。

で、最終的にどうしたかというと、delegateの中で sampleBufferからCGBitmapContextCreateでbitmapを作って、そこから CGImageを作る。
そこから定番のCGImageGetDataProvider/CGDataProviderCopyDataでCFDataRefを作って、そのコピーをメンバ変数に設定して全体で使えるようにしておく。

使う側では、そのコピーからCGImageを作って、UIImageにしてやる。
っと、ここまでやればキャプチャされたデータをメインスレッド側で好き勝手に使えるようになるみたいだ。

結構、めんどくさいね。。。。(^^;