Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab //// une carte des membres//// (apéros) codelab


#1 2013-06-18 00:56:05 Synchro 3 sources video en OSC

Marty
membre
Date d'inscription: 2012-04-27
Messages: 143

Synchro 3 sources video en OSC



Hello,

Je viens vous soumettre un petit problème. Petit état des lieux :

J'ai 3 sources video. Des macmini avec VDMX + TripleHead pour réaliser une projection en 360° dans une salle avec 6 projecteurs (2 par sources). Les travaux préparatoires ont été effectués : découpage de la video, assignation des médias aux différents players etc.

L'idée est maintenant de réaliser une télécommande sous oF afin de synchroniser la lecture des videos en envoyant aux 3 sources VDMX des infos en OSC.

L'appli est faite, tout fonctionne à un petit détail près : un problème de synchro à la lecture...

L'appli consiste en :
- un bouton PLAY
- un bouton PAUSE
- un bouton REMBOBINER
- une TIMELINE pour naviguer dans la video.

Config :

- Les boutons de lecture des sources VDMX sont configurés pour répondre à la réception du message OSC .../play 1 et .../play 0 sur le port 1234

- les timelines des VDMX "écoutent" la TIMELINE de l'appli oF qui envoie la position du slider quand on le manipule sur le port 1234

- une des timeline de VDMX renvoie la position de lecture à l'appli oF pour que celui-ci évolue en même temps que l'avancée de la video intégrale. envoi sur le port 1235

Dans mon idée donc, tout devrait être synchro : oF envoyant sa position aux 3 lecteurs et récupérant la valeur d'un VDMX

Symptomes :

- en faisant PLAY sur oF -> Synchro OK
- faire PAUSE puis PLAY -> Synchro OK
- REMBOBINER -> Synchro OK
- modification de la position de la TIMELINE -> perte de synchro (de l'ordre d'un peu moins de 1 seconde)

Une fois désyncronisé :

- PAUSE / PLAY -> problème de synchro persiste
- REMBOBINER -> Synchro OK

je précise qu'après un PLAY (donc synchro) j'ai laissé tourner la video toute la journée, tout était toujours synchro le soir, la TIMELINE aussi suivait toujours bien les sliders des VDMX

En gros tant que l'on ne touche pas à la TIMELINE, celle ci évolue normalement et tout reste synchro. Il semble donc y avoir un problème du côté de l'envoi de la position de la TIMELINE aux VDMX...

Impossible de trouver d'ou cela peut provenir !

Je vous laisse le code cpp :

#include "testApp.h"

//--------------------------------------------------------------
void testApp::setup(){

    // INIT OSC SENDER & RECEIVER
	sender1.setup("192.168.5.94", 1234);
	sender2.setup("192.168.5.96", 1234);
	sender3.setup("192.168.5.97", 1234);
	receiver.setup(1235);
	
	ofSetFrameRate(30);

    float xInit = OFX_UI_GLOBAL_WIDGET_SPACING;
    float length = ofGetWidth()-xInit;

    ofBackground(233, 27, 52);
    gui = new ofxUICanvas(0,0,ofGetWidth(),ofGetHeight());

    gui->addWidgetDown(new ofxUILabelButton(length-xInit, false, "PLAY", OFX_UI_FONT_MEDIUM));
	gui->addWidgetDown(new ofxUILabelButton(length-xInit, false, "PAUSE", OFX_UI_FONT_MEDIUM));
    gui->addWidgetDown(new ofxUILabelButton(length-xInit, false, "REMBOBINER", OFX_UI_FONT_MEDIUM));
	gui->addSpacer();
	gui->addSlider("TIMELINE", 0.0, 465.0, slider_position, length-xInit, 32);
	gui->addSpacer();

    ofAddListener(gui->newGUIEvent, this, &testApp::guiEvent);
}

//--------------------------------------------------------------
void testApp::update(){
	ofxOscMessage msgRx;
    receiver.getNextMessage( &msgRx );
	if ( msgRx.getAddress() == "/babylon/vdmx_slider_feedback" )
    {
        slider_position = msgRx.getArgAsFloat(0);
		ofxUISlider *slider = (ofxUISlider *) gui->getWidget("TIMELINE");
		slider->setValue(slider_position);
    }
}

//--------------------------------------------------------------
void testApp::draw(){

}

////////////////////// OFXUI FUNCTIONS /////////////////////////
void testApp::exit()
{
    delete gui;
}

void testApp::guiEvent(ofxUIEventArgs &e)
{
    if(e.widget->getName() == "PLAY")
    {
		ofxUILabelButton *btn = (ofxUILabelButton *) e.widget;
		if (btn->getValue() == true) {
			ofxOscMessage m;
			m.setAddress("/babylon/play");
			m.addIntArg(1);
			sender1.sendMessage(m);
			sender2.sendMessage(m);
			sender3.sendMessage(m);
		}
    }
	else if(e.widget->getName() == "PAUSE")
    {
		ofxUILabelButton *btn = (ofxUILabelButton *) e.widget;
		if (btn->getValue() == true) {
			ofxOscMessage m;
			m.setAddress("/babylon/play");
			m.addIntArg(0);
			sender1.sendMessage(m);
			sender2.sendMessage(m);
			sender3.sendMessage(m);
		}
    }
	else if(e.widget->getName() == "REMBOBINER")
    {
		ofxUILabelButton *btn = (ofxUILabelButton *) e.widget;
		if (btn->getValue() == true) {
			slider_position = 0;
			ofxUISlider *slider = (ofxUISlider *) gui->getWidget("TIMELINE");
			slider->setValue(0);
			ofxOscMessage m;
			m.setAddress("/babylon/slider_position");
			m.addFloatArg(0);
			sender1.sendMessage(m);
			sender2.sendMessage(m);
			sender3.sendMessage(m);	
		}
    }
	else if(e.widget->getName() == "TIMELINE")
    {
        ofxUISlider *slider = (ofxUISlider *) e.widget;
        ofxOscMessage m;
        m.setAddress("/babylon/slider_position");
	slider_position = slider->getScaledValue();
        m.addFloatArg(slider->getScaledValue());
	sender1.sendMessage(m);
        sender2.sendMessage(m);
        sender3.sendMessage(m);
    }	
}

PS : J'utilise les addons suivant

- ofxOSC, dispo en natif avec oF
- ofxUI (pour l'interface graphique) dispo ici : https://github.com/rezaali/ofxUI
- ofxXmlSettings, natif oF

merci pour vos lumières

Dernière modification par Marty (2013-06-18 01:02:24)

Hors ligne

 

#2 2013-06-18 06:33:53 Re : Synchro 3 sources video en OSC

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 802

Re: Synchro 3 sources video en OSC



Bonjour,

Je ne vois pas l'utilité de la réception de message OSC.
Lors de la réception d'un message provenant de VDMX, tu n'envoies pas de message OSC aux autres VP.
Je suppose que tu as bien vérifié que la valeur envoyée à VDMX est la même que celle réceptionnée.

Pas d'autres idées.

Hors ligne

 

#3 2013-06-18 08:43:57 Re : Synchro 3 sources video en OSC

Marty
membre
Date d'inscription: 2012-04-27
Messages: 143

Re: Synchro 3 sources video en OSC



Salut Mushussu,

Je vais voir du côté de l'envoi de messages aux autres vp dont tu parles...

J'ai effectivement bien vérifié, les valeurs en réception et en émission sont ok.

Le retour de valeurs de VDMX sert à faire évoluer la Timeline de l'appli oF qui se "synchronise" sur celle de VDMX.

Merci pour ton aide

Hors ligne

 

#4 2013-06-19 09:57:10 Re : Synchro 3 sources video en OSC

lilive
membre
Lieu: Toulouse
Date d'inscription: 2011-06-24
Messages: 52
Site web

Re: Synchro 3 sources video en OSC



Bonjour,

Hypothèse de ma part:
L'opération de sauter à une certaine position est couteuse en temps, et ce cout n'est pas toujours le même. C'est ce qui entrainerait la désynchronisation, certains des mac réalisant l'opération plus vite que d'autres.

En quoi tes fichiers vidéos sont-ils encodés ? Si c'est un codec vidéo qui reconstitue une image à partir d'un certain nombre d'images précédentes, genre mpeg4, ça me semble expliquer le problème, car j'imagine que les vidéos diffusées par les macminis sont différentes, du coup les opérations à faire pour sauter à une image précise sont différentes. Dans ce cas, une solution pourrait être d'utiliser un codec qui n'a pas besoin d'accéder aux images précédentes pour afficher une image donnée. Par exemple le motion jpeg.

Un autre essai possible serait de mettre toutes les vidéos en pause juste après le saut, d'attendre une seconde, le temps que chaque macmini ait le temps de faire le saut, puis de faire un play pour tout le monde en même temps.

Hors ligne

 

#5 2013-06-19 11:25:28 Re : Synchro 3 sources video en OSC

sakramh
membre
Lieu: clichy-sous-bois
Date d'inscription: 2008-12-02
Messages: 829
Site web

Re: Synchro 3 sources video en OSC



Je sais pas ce qu'est un VDMX et je ne suis pas très fort en C++ mais ce que je peux dire c'est que :
en synchro video (et même audio) les messages EBU/SMPTE sont exprimés en heures:minutes:secondes:fps:fps/100 .
un "pre-roll" peut aussi être indiqué pour laisser le temps à tout le monde de se caler . Une "offset" peut être appliquée indépendamment à chaque machine lectrice/enregistreuse .
Tes messages OSC de timeline expriment leurs positions en quelle unité ?
Le principe de base étant qu'il y ait un Maître et x Esclaves . Le maître indiquant la position demandée en images en quelque sorte . (voire 100ème) .
Cela impliquerait, à 25 fps un message OSC de position toutes les 40 ms si on ne tiens pas compte des 100ème .
Ou au moins un (des) message(s) de position(s) en frames à chaque changement dans la timeline .

Dernière modification par sakramh (2013-06-19 11:38:48)


le code est l'alchimie de l'âge du silicium

Hors ligne

 

#6 2013-06-19 12:30:26 Re : Synchro 3 sources video en OSC

Marty
membre
Date d'inscription: 2012-04-27
Messages: 143

Re: Synchro 3 sources video en OSC



Salut sakramh,

Merci pour cette piste intéressante.
VDMX n'a rien à voir avec C++, c'est un soft de VJing : http://vidvox.net/
Sur les 3 VDMX qui tournent tous recoivent un signal de la Timeline, mais un seul renvoie une valeur.
Il y a peut être un truc à creuser du côté des FPS. Mais j'ai bien vérifié, les VDMX semblent bien recevoir les mêmes infos. En fait je n'envoie rien en HH:MM:SS mais une valeur entre 0 et 465 (durée de la timeline sur VDMX) en float avec une bonne précision quand même.

Hors ligne

 

#7 2013-06-19 14:45:34 Re : Synchro 3 sources video en OSC

sakramh
membre
Lieu: clichy-sous-bois
Date d'inscription: 2008-12-02
Messages: 829
Site web

Re: Synchro 3 sources video en OSC



donc en fait , il faut que ton "soft maître" envoie 3 messages tels que :
/vdmx1/position/((465:longueurVideo1)+offset1) // longueurVideo et offset en frames
/vdmx2/position/((465:longueurVideo1)+offset2)
/vdmx3/position/((465:longueurVideo1)+offset3)
évidement que repartir à 0 ou play suite à pause ne montre pas le souci .
encore que se soit pure chance que les 3 s'arrêtent au même point et repartent sync .
c'est à peu près ce que je fait avec plusieurs instances de gephex et gem. Un compteur (à fps variable) qui envoie la position aux instances qui en ont besoin .
J'ai jamais regardé le code source mais c'est aussi ce que fait JackControl (en OSC et de façon multidirectionnelle ) avec les "daw" et séquenseurs et xjadeo pour la video .

Dernière modification par sakramh (2013-06-19 14:55:58)


le code est l'alchimie de l'âge du silicium

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2024