2011-03-15 11 views
0

FireWireカメラからのビデオ出力ストリームを監視しようとしています。私は、ボタンとを持つInterface Builderインターフェイスを作成しました。フライ(ゲイン、ガンマなど)にいくつかのカメラパラメータ NSOperationまたはNSRunLoopを使用する必要がありますか?

  • は、私はに画像を保存することができます停止するために監視を伝える

    • 変更:画像監視は無限ループ内で行われている間、私はにしたいです(ループを止めるフラグを設定する)

    ボタンの機能を使用して、ボタンの押下を探している間にビデオフレームモニタをループすることができませんでした(Cのキー押下)2つのオプションがあります:

    1. 新しい実行ループを開始する(機能するためにオートリリープールができない...)
    2. NSOperationを起動する - Xcodeボタンのプッシュで接続できるようにするにはどうすればよいですか?

    ドキュメントは、このようなオブジェクトの作成について非常に鈍いです。私が見つけた例でNSOperationを作成した場合、Interface Builderのオブジェクトと通信する方法がないようです。 NSRunLoopを作成すると、オブジェクトリークエラーが発生します。作成したRunLoopに実際に応答する自動解放プールを作成する方法の例は見つかりません。 2番目の実行ループによってサンプリングされるオブジェクトを選択しようとしたこともないことを心配しないでください。

    Objective Cは(私の母国語ではありません)ため、たとえば... ありがとうございます。

  • 答えて

    2

    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に手動のカメラ設定の調整を加えることができれば、ほとんどすべてを取り除くことができました。

    0

    接続しようとしているのは、接続されているカメラの出力を見る/掴むことだけではないでしょう。

    QTKit's QTCaptureViewを使用してください。問題が解決しました。 grab a frameに送ってみませんか?また問題ありません。あなた自身をロールしようとしないでください - QTKitのものは最適化され、OSの一部です。私はあなたが望むようにカメラのプロパティに影響を与えることができると確信していますが、そうでない場合は、プランBが機能するはずです。

    プランB:しょっちゅうフレームをつかむ(上記のリンク「どのように」)とあなたのNSImageViewに表示する前に(多分Core Image付き)フレームにあなたのイメージ操作を適用するためにQTKitもお使いいただけを依頼するNSTimerを繰り返し、スケジュール設定を使用してください。

    +0

    QTKitキャプチャAPIを使用して、付属のFireWireカメラの露出、ゲインなどのパラメータを変更する方法は現在ありません(rdar:// 5760371「QTKitキャプチャでカメラの明るさやゲインなどを設定する機能この機能をご希望の場合は「API」を選択してください)。 –

    +0

    私はQTKitを使って "Cocoa is my girlfriend"という次の例を見てきました。[link] http://www.cimgf.com/2008/02/23/nsoperation-example/これは有望です。私もlibdc1394のものを使用しています。私はイメージをキャプチャしたように見えます。私は使用できます(符号なしのcharへのポインタを、14ビットカメラの16ビット整数の配列に変換し、最終的にはTIFFファイルとして保存する...)形式でデータにアクセスするのに問題があります。 –

    +0

    絶対的なコントロール、ブラッドの方法は健全なアプローチですが、私は本当にQTKitが行く方法だと思います。これを行うにはNSOperationを使用するのはきれいですが、すばやく、別のスレッドを使用する必要はありません。 –

    関連する問題