友人が展示に使いたいとの事で、
3面に3つのPCから映像を同期再生。
QuartzCompozerでOSCとか使えば一瞬だ。と思ったが、OSX10.2のマックがあるらしい。
そこで最近勉強中のopenFrameworksで作ってみようと。でも10.2で動くのかな?まあいいか。
以下、ソース。
マックデフォルトのファイル選択ウィンドウから、ファイルを選べたらいいな、と思ったのだが出来なかったため。いろいろ勝手に決めている。
ムービーファイルは"/Users/Shared/movie.mov"におく。
同期する2つのパソコンのIPアドレスは"192.168.1.20"と"192.168.1.21"。
メインパソコンのスペースバーで再生、停止。他の2つも同期する。
ひどいな。全然OF分からん。でもProcessing(Java)より、quicktimeは安定している。そりゃそうか。もっと勉強します。
testApp.h
#ifndef _TEST_APP #define _TEST_APP #include "ofMain.h" #define OF_ADDON_USING_OFXOSC #include "ofAddons.h" #define HOST0 "localhost" #define HOST1 "192.168.1.20" #define HOST2 "192.168.1.21" #define PORT 3333 #define MOVIE_FILE "/Users/Shared/movie.mov" class testApp : public ofSimpleApp{ public: testApp(); void setup(); void update(); void draw(); void keyPressed (int key); void mouseMoved(int x, int y ); void mouseDragged(int x, int y, int button); void mousePressed(int x, int y, int button); void mouseReleased(); private: ofVideoPlayer movie; ofxOscSender oscS0; ofxOscSender oscS1; ofxOscSender oscS2; ofxOscReceiver oscR; bool bPlaying; bool bMainPC; void play(); void pause(); void allPlay(); void allPause(); }; #endif
testApp.cpp
#include "testApp.h" //-------------------------------------------------------------- testApp::testApp() { } //-------------------------------------------------------------- void testApp::setup(){ ofBackground(0, 0, 0); ofHideCursor(); ofSetFrameRate(60); bPlaying = 0; bMainPC = 0; movie.loadMovie(MOVIE_FILE); movie.setLoopState(0x01); //movie.getDuration(); oscS0.setup(HOST0, PORT); oscS1.setup(HOST1, PORT); oscS2.setup(HOST2, PORT); oscR.setup(PORT); } //-------------------------------------------------------------- void testApp::update(){ //ofBackground(100,100,100); movie.idleMovie(); movie.setLoopState(0x01); //printf("%f \n", ofGetFrameRate()); while( oscR.hasWaitingMessages() ) { ofxOscMessage msg; oscR.getNextMessage(&msg); if(strcmp(msg.getAddress(), "/qtmovie") == 0) { if(strcmp(msg.getArgAsString(0), "play") == 0) { play(); } else if (strcmp(msg.getArgAsString(0), "pause") == 0) { pause(); } } } if(bMainPC) { if(movie.getPosition() >= 1) { allPause(); //pause(); ofSleepMillis(1 * 1000); allPlay(); cout << "looppppDAYO" << "\n"; } } } //-------------------------------------------------------------- void testApp::draw(){ movie.draw(0,0,ofGetScreenWidth(),ofGetScreenHeight()); } //-------------------------------------------------------------- void testApp::keyPressed (int key){ switch (key){ case ' ': bPlaying = !bPlaying; bMainPC = true; if(bPlaying == 1) { allPlay(); } else { allPause(); } break; } } //-------------------------------------------------------------- void testApp::mouseMoved(int x, int y ){ } //-------------------------------------------------------------- void testApp::mouseDragged(int x, int y, int button){ } //-------------------------------------------------------------- void testApp::mousePressed(int x, int y, int button){ } //-------------------------------------------------------------- void testApp::mouseReleased(){ } //------------------------------------------------------------- void testApp::play() { movie.play(); movie.setPaused(false); bPlaying = true; } //-------------------------------------------------------------- void testApp::pause() { movie.setPosition(0.0); movie.setPaused(true); bPlaying = false; } //-------------------------------------------------------------- void testApp::allPlay() { // send osc message ofxOscMessage msg; msg.setAddress("/qtmovie"); msg.addStringArg("play"); oscS1.sendMessage(msg); oscS2.sendMessage(msg); oscS0.sendMessage(msg); } //-------------------------------------------------------------- void testApp::allPause() { // send osc message ofxOscMessage msg; msg.setAddress("/qtmovie"); msg.addStringArg("pause"); oscS1.sendMessage(msg); oscS2.sendMessage(msg); oscS0.sendMessage(msg); }
main.mm
#include "ofMain.h" #include "testApp.h" //======================================================================== int main( ){ ofSetupOpenGL(720, 480, OF_FULLSCREEN); // this kicks off the running of my app // can be OF_WINDOW or OF_FULLSCREEN // pass in width and height too: //FileOpener * fileOpener = [[FileOpener alloc] init]; //[fileOpener open]; ofRunApp(new testApp()); }