Help us understand the problem. What is going on with this article?

OpenFrameworksでSyphonを使用する

More than 3 years have passed since last update.

発端

前回初めて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ができるので、こちらもグリグリしがいがあります。

tai_fukaya
元アクアリング鶴舞ラボ
groove-x
世界のどこにもない、心を満たすロボットを。私たちGROOVE Xは2015年に設立したスタートアップです。私たちの考えるロボットは、人々の生活に潤いを与える存在として、人が一緒にいたくなるような新世代の家庭用ロボットです。便利さや機能性ではなく、家族や伴侶として愛される存在になれるかどうか。 GROOVE Xが追求するのはあなたの感性の領域に訴えるロボットです。
https://groove-x.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした