OpenFrameworksでSyphonを使用する

  • 20
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

発端

前回初めてVJをした時に、モニタリングできるディスプレイが近くにあるものと思ったら無く、遠くのほうのディスプレイを見ながら、やったので、写真を見たら、真剣に前を向いてて、ちょっと恥ずかしいかんじに。
普段macbookのディスプレイばかり見ているエンジニアには、こんな前をずっと、お客さんをずっと見るケースがないので、それはそれでいいのかもしれんが・・・、真剣な眼差しをするには、すこし場違い。

ということで、普段の姿でモニタリングしながら、VJをやるために、syphonを組み込んでみます。

Syphonとは

http://syphon.v002.info/

同一ホスト内の映像によるプロセス間通信を可能とするライブラリ。
TCP/IP通信をするTCPSyphonというのもあるようですね。
TCPSyphon

VJ用途で作られたため、遅延も少なく、
Unity、oF、processing、UE4で生成した画像をやりとりできます。

ちなみに、鶴舞ラボのオープニングセレモニーで、使用いたしました。

使用方法

oF用のアドオンは以下よりダウンロード
ofxSyphon

以下の方法が一番エラーがなく使用できます。
・ProjectGeneratorではなく、addons直下にドラッグアンドドロップで追加する。
・libs/Syphon/lib/osx/Syphon.frameworkをBuild Phases/Copy Filesにドラッグアンドドロップで追加する。
スクリーンショット 2015-09-28 18.17.16.png

サンプル

ofxSyphonのサンプルを参考にしつつ、
とりあえず以下のような使い方をイメージしたサンプルを作成しました。
・送信側で映像を生成し、任意のタイミングで送信(ofxUIや、キー入力)。
・受信側は、一番新しく送られてきた映像を表示する。

送信側

ofApp.cpp
void ofApp::setup(){

    mainOutputSyphonServer.setName("Screen Output");

    mClient.setup();
    mClient.set("", "Syphon Test Server");

    fbo.allocate(SCREEN_WIDTH, SCREEN_HEIGHT, GL_RGBA);
}

void ofApp::update(){

    // FBOに保存
    ofPushStyle();
    fbo.begin();

    // 処理を書く

    fbo.end();
    ofPopStyle();
}

void ofApp::draw(){

    mClient.draw(50, 50);

    ofTexture tex = fbo.getTextureReference();
    tex.draw(0, 0, ofGetWidth(), ofGetHeight());

    mainOutputSyphonServer.publishTexture(&tex);
}

fboを使用すると、モニタリング用のディスプレイよりも大きなサイズの映像が作成できるので、便利ですね。

受信側

ofApp.cpp
void ofApp::setup(){
    ofSetFrameRate(60);

    dir.setup();
    client.setup();

    ofAddListener(dir.events.serverAnnounced, this, &ofApp::serverAnnounced);
    ofAddListener(dir.events.serverRetired, this, &ofApp::serverRetired);

}

void ofApp::serverAnnounced(ofxSyphonServerDirectoryEventArgs &arg)
{
    for( auto& dir : arg.servers ){
        // 描画
        client.set(dir);
    }
}

void ofApp::serverRetired(ofxSyphonServerDirectoryEventArgs &arg)
{
    // 送信されてくるものがあれば、それを描画する
    if (dir.size() > 0) {
        client.set(dir.getDescription(0));
    }
}
void ofApp::draw(){
    ofPushMatrix();
    if (dir.size() > 0) {
        client.draw(0, 0);
    }
    ofPopMatrix();
}

まとめ

FBOの内容をテクスチャにして、送信できるのは、いろいろ使い勝手が良さそうですね。
受信側もbind、unbindができるので、こちらもグリグリしがいがあります。