FireWireカメラの連続したビデオディスプレイでのみ、ほぼ同じようにする必要がありました。私の場合は、libdc1394 libraryを使用して、FireWireカメラのフレームキャプチャとカメラプロパティの調整を行いました。 Carbon Quicktimeの関数を使ってこれを行うこともできますが、libdc1394が理解しやすくなりました。
ビデオキャプチャループでは、カメラをポーリングして共有リソースをロックする別のスレッドから、1つのNSOperationQueueを使用してカメラとのやり取りを行い、最後にCVDisplayLinkを使用して解決しました画面のリフレッシュレートに一致するようにカメラをポーリングします。
CVDisplayLink次のコード使用して構成されている:
CGDirectDisplayID displayID = CGMainDisplayID();
CVReturn error = kCVReturnSuccess;
error = CVDisplayLinkCreateWithCGDisplay(displayID, &displayLink);
if (error)
{
NSLog(@"DisplayLink created with error:%d", error);
displayLink = NULL;
}
CVDisplayLinkSetOutputCallback(displayLink, renderCallback, self);
を、それが新たなカメラフレームの検索をトリガするために、次の関数を呼び出す:
static CVReturn renderCallback(CVDisplayLinkRef displayLink,
const CVTimeStamp *inNow,
const CVTimeStamp *inOutputTime,
CVOptionFlags flagsIn,
CVOptionFlags *flagsOut,
void *displayLinkContext)
{
return [(SPVideoView *)displayLinkContext renderTime:inOutputTime];
}
CVDisplayLinkを開始し、使用して停止させます以下:
- (void)startRequestingFrames;
{
CVDisplayLinkStart(displayLink);
}
- (void)stopRequestingFrames;
{
CVDisplayLinkStop(displayLink);
}
ロックを使用するのではなくFireWireカメラ通信では、露出、ゲインなどを調整する必要があるときはいつでも、対応するインスタンス変数を変更し、変更する設定を示すフラグ変数内の適切なビットを設定します。次のフレームの取得時に、CVDisplayLinkからのコールバックメソッドは、ローカルに格納されたインスタンス変数と一致するようにカメラの適切な設定を変更し、そのフラグをクリアします。
画面への表示は、NSOpenGLView(この速度で更新するとあまりにも多くの視覚的なアーティファクトが導入され、その更新コールバックがメインスレッド上で実行された)によって処理されます。 Appleは、パフォーマンスを向上させるために、これらのフレームをDMAを使用してテクスチャとして提供するために、いくつかのextensions you can useを持っています。
残念ながら、私がここで説明したものは、初級レベルのものではありません。私は、これらのカメラハンドリング機能のための約2,000行のコードを私たちのソフトウェアで持っていました。そして、これは困惑するのに長い時間がかかりました。 AppleがQTKit Capture APIに手動のカメラ設定の調整を加えることができれば、ほとんどすべてを取り除くことができました。
QTKitキャプチャAPIを使用して、付属のFireWireカメラの露出、ゲインなどのパラメータを変更する方法は現在ありません(rdar:// 5760371「QTKitキャプチャでカメラの明るさやゲインなどを設定する機能この機能をご希望の場合は「API」を選択してください)。 –
私はQTKitを使って "Cocoa is my girlfriend"という次の例を見てきました。[link] http://www.cimgf.com/2008/02/23/nsoperation-example/これは有望です。私もlibdc1394のものを使用しています。私はイメージをキャプチャしたように見えます。私は使用できます(符号なしのcharへのポインタを、14ビットカメラの16ビット整数の配列に変換し、最終的にはTIFFファイルとして保存する...)形式でデータにアクセスするのに問題があります。 –
絶対的なコントロール、ブラッドの方法は健全なアプローチですが、私は本当にQTKitが行く方法だと思います。これを行うにはNSOperationを使用するのはきれいですが、すばやく、別のスレッドを使用する必要はありません。 –