SPOUT에서 OpenFramewoks 비디오를 vvv로 전송

개요
OpenFrameworks 및 Processing 의 이미지 수신
출력하려면 SPOUThttp://spout.zeal.co/를 사용합니다.
맥이 말한 Syphonhttp://syphon.v002.info/이죠.
SPOUT를 사용하여 vvv로 다른 언어로 생성된 이미지 수신
대신 vvv로 제작된 영상을 오픈 프레임 웍스 등에 보낼 수 있다.
이 글은 오픈 프레임워크스에서 생성된 영상을 SPOUT로 보내고 vvv로 받는 방법을 소개했다.
전체도
시스템의 구성은 다음과 같다.

전송 측면의 OpenFrameworks에서 SPOUT의 DLL을 사용하여 영상 전송
수신 측면의 vvv에서 Spout-Receiver.v4p로 영상을 수신합니다.
vvv의 영상 전송과 수신은 모두 간단하지만 오픈 프레임워크스는 좀 번거롭습니다.
(오픈프레임워크스에 익숙하지 않아서일지도 몰라요.)
SPOUT 다운로드 및 설치 준비
Downloadhttp://spout.zeal.co/를 클릭하여 Spout 다운로드
SpoutSetup_V2.004-beta.zip을 얻다.

ZIP 파일의 압축을 풀고 SpoutSetupV2.004-beta.실행 후
설치를 시작합니다.
설치 주소는 어디든지 가능합니다.압축된 파일만 사용했기 때문이다.
(※ 인트로의 이미지 발췌문)




대상 폴더 설치를 확인한 후 Spout2의 폴더는 다음과 같이 확장됩니다.

그 다음에 Spout2/SPOUTSDK/SPoutsDK/Binaries에 있는 Spout2를 보냅니다.dll、Spout2.lib、SpoutDLL.h.

Spout2/VVV/Receiver/DirectX9(11도 OK)의 패치 파일을 수신합니다.

openFrameworks의 실현에 관하여\Spout2\SPOUTSDK\SpoutSDK\SPOUTDLL\cbspoutExample\src를 사용하는 원본 코드를 복제합니다.
이 곳들을 기억해 주세요.

OpenFrameworks(0.9.0)의 SPOUT(Sender) 설정(Visual Studio 2015편)
openFrameworks에서 새 프로젝트를 만드는 상태부터 설명합니다.
openFrameworks에서 http://yoppa.org/보시면 모두 적혀 있으니 그쪽을 참고하세요.위대하다.
이제 Spout을 사용할 준비가 되었습니다.Spout2.dll、Spout2.lib을 openFrameworks 프로젝트의 bin 폴더로 복사합니다.
또한 SpoutDLL 은h를 src 폴더로 복사합니다.
SpoutDLL.프로젝트에 h를 추가합니다.
SolutionExplorer의 src를 마우스 오른쪽 버튼으로 클릭하고 Add>Existing Item에서 방금 구성한 SpoutDLL을 클릭합니다.h를 선택하면 됩니다.

이런 느낌으로 Solution Explorer에서 (위) SpoutDLL.h를 추가합니다.

다음은 Spout2입니다.Linker에 lib을 추가합니다.
Project&Vs2015 Test(※ 프로젝트 이름) Properties에서 PropertyPages 열기
Linker의 Input을 선택하고 Additional Dependencies에서 ".\bin\Spout2.lib"을 선택합니다.
텍스트 상자에 기록하려면 OK 를 클릭합니다.


이렇게 준비됐습니다.
ofApp.h의 실현
다음은 실크입니다.
main.cpp는 특별히 편집할 필요가 없습니다.
ofApp.h에서는 SpoutDLL입니다.포함
#include "SpoutDLL.h" // for Spout2 dll
그리고 오프앱.cpp에 사용되는 변수를 정의합니다.
소스 코드는 설치처의\Spout2\SPOUTSDK\SpoutSDK\SPOUTDLL\cbspoutExample\src\of Appl입니다.h의 일부분을 복제하면 됩니다.
void exit();
bool InitGLtexture(GLuint &texID, unsigned int width, unsigned int height);
char sendername[256];           // Shared memory name
GLuint sendertexture;           // Local OpenGL texture used for sharing
bool bInitialized;          // Initialization result
ofImage myTextureImage;         // Texture image for the 3D demo
float rotX, rotY;
ofApp.cpp 설치
다음 오피스 앱.cpp의 실현입니다.
\Spout2\SPOUTSDK\SpoutSDK\SPOUTDLL\cbSpoutExample\src\ofApp.참조 cpp
필요한 코드를 복사합니다.
우선 namespace를 기입하세요.
// ====== SPOUT =====
using namespace Spout2;
다음은 setup () 의 설치입니다. 샘플에서 다음 코드를 복사합니다.
sendername의 문자열은 vvv와 공통 문자열이어야 합니다
적당히 해.
// ====== SPOUT =====
bInitialized = false;               // Spout sender initialization
strcpy(sendername, "CB Spout Sender");  // Set the sender name
ofSetWindowTitle(sendername);           // show it on the title bar
                                        // Create an OpenGL texture for data transfers
sendertexture = 0; // make sure the ID is zero for the first time
InitGLtexture(sendertexture, ofGetWidth(), ofGetHeight());
// Set the window icon from resources
//SetClassLong(GetActiveWindow(), GCL_HICON, (LONG)LoadIconA(GetModuleHandle(NULL), MAKEINTRESOURCEA(IDI_ICON1)));
// ===================
다음은 draw () 설치입니다.
여기는 SPOUT이 보내고자 하는 범위입니다.
CreateSender 및 SendTexture로 둘러싸여 있습니다.
//--------------------------------------------------------------
void ofApp::draw(){

    char str[256];
    ofSetColor(255);

    // ====== SPOUT =====
    // A render window must be available for Spout initialization and might not be
    // available in "update" so do it now when there is definitely a render window.
    if (!bInitialized) {
        bInitialized = CreateSender(sendername, ofGetWidth(), ofGetHeight()); // Create the sender
    }
    // ===================
    //ここから

    ofDrawCircle(100.0, 100.0, 10.0, 15.0);

    //ここまでが送信される。
    // ====== SPOUT =====
    if (bInitialized) {

        if (ofGetWidth() > 0 && ofGetHeight() > 0) { // protect against user minimize

                                                     // Grab the screen into the local spout texture
            glBindTexture(GL_TEXTURE_2D, sendertexture);
            glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, ofGetWidth(), ofGetHeight());
            glBindTexture(GL_TEXTURE_2D, 0);

            // Send the texture out for all receivers to use
            SendTexture(sendertexture, GL_TEXTURE_2D, ofGetWidth(), ofGetHeight());

            //ここからの映像は送信されないのでUIとかを表示させてもいいかも

            // Show what it is sending
            ofSetColor(255);
            sprintf(str, "Sending as : [%s]", sendername);
            ofDrawBitmapString(str, 20, 20);

            // Show fps
            sprintf(str, "fps: %3.3d", (int)ofGetFrameRate());
            ofDrawBitmapString(str, ofGetWidth() - 120, 20);

        }
    }
    // ===================
}
그런 다음 윈도우 Resized, exit, InitGLtexture를 샘플에서 덮어쓰기
완성
//--------------------------------------------------------------
void ofApp::windowResized(int w, int h) {
    // ====== SPOUT =====
    // Update the sender texture to receive the new dimensions
    // Change of width and height is handled within the SendTexture function
    if (w > 0 && h > 0) // protect against user minimize
        InitGLtexture(sendertexture, w, h);

}

//--------------------------------------------------------------
void ofApp::exit() {

    // ====== SPOUT =====
    ReleaseSender(); // Release the sender

}

// ====== SPOUT =====
bool ofApp::InitGLtexture(GLuint &texID, unsigned int width, unsigned int height)
{
    if (texID != 0) glDeleteTextures(1, &texID);

    glGenTextures(1, &texID);
    glBindTexture(GL_TEXTURE_2D, texID);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glBindTexture(GL_TEXTURE_2D, 0);

    return true;
}
조금 어려운 것은 최초의 SpoutDLL이다.lib의 설정이나 설정인가요...
상당히 수고하셨습니다.
컴파일 오류의 연속.
실크는 복사해서 붙이면 되는데 문제 없나요?
vvv의 SPOUT(Reviever)
다음은 수신자 vvv의 실현입니다.이곳은 매우 간단하다.
Spout2/VVVV/Receiver/DirectX 9/DX9_ReceiverExample.v4p, Spout 실행Receiver의
SpoutSenderName의 문자열을 수신하려면 전송 측면의 문자열을 동일하게 만듭니다.
이번에는 샘플과 마찬가지로'CB Spout Sender'로 변경됐다.
vvvv는 Texture를 받을 수 있기 때문에 그 다음에 FulscrenQuad를 더해서 Render에게 연락하면
OpenFrame works의 이미지를 vv로 표시할 수 있습니다.
나, vvv는 효과의 주요 이미지인 오픈 프레임 워크스를 간단하게 변경할 수 있기 때문에
효과와 그림의 전환은 vvv로 진행됩니다.
모두 vv로 그리면 안 된다고 했지만 아직 성숙하지 않아서 그리고 싶은 그림은 vv로 그리면 안 돼요.
그리고 오픈 Framewoks에서 shader를 사용한 영상을 vvv에 전송합니다.
이렇게 되면 GLSandBox와 같은 GLSL의 영상도 vv로 처리할 수 있다.
(HLSL로 이식하면 되잖아...)
실장은 이런 느낌.오픈프레임웍스의 Hello World라고 할 수 있죠.
3Dprimitives Example의 영상을 vvv에 보내서 보여 줍니다.
vv 효과를 가하여 최종 출력합니다.

이렇게 하면 오픈 프레임워크스의 영상도 vv로 보낼 수 있다.
다만, 전송 측면의 창을 최소화하면 영상이 멈춘다
전송 측면의 창은 미리보기적으로 작아지고 실제 발송된 영상은 1280이다×800에 달하다
하고 싶은 느낌은 들지만 해결책은 몰라요.
SPOUT,oF에 익숙한 사람이 있으면 알려주세요.
총결산
비록 vvv가 상당히 열광적이지만, 나는 더욱 열광적인 SPOUT에 관한 보도를 썼다.필요하지 않을 수도 있지만 Windows 환경에서는 Syphon을 사용할 수 없기 때문에 오픈 프레임워크스의 내용을 vv로 활용하고 싶은 사람(이런 사람이 있나...)에게 도움이 된다면 좋겠습니다.
어떤 게 오픈 프레임 기사인가요?이런 말도 있고...
결국 vvv를 사용해서 좋아요.
그리고 손으로 더듬어 썼기 때문에 스푸트를 영입하는 정당한 방법은 아닌 것 같다.
당신이 각양각색의 문제를 지적해 주시기를 바랍니다.그리고 질문이 있으면 질문하세요.
요구 사항이 있으면 GiitHub에게 샘플 코드를 줄 수 있지만 SPOUT의 샘플도 충분합니다...

좋은 웹페이지 즐겨찾기