# Synchroniser 2 videos avec quicktime et appelscript



## matmateo (1 Avril 2009)

Bonjour,
Je cherche à synchroniser deux vidéos quicktime avec applescript.

Les deux vidéos ont la même durée, la première se lance sur l'écran 1 la seconde sur l'écran 2.
Avec ce script, les vidéos se lance correctement mais il y a un léger décalage.
Savez vous comment obtenir une synchronisation parfaite.


set film1 to "/Volumes/VolumeRaid/ENCODAGE/EXPO/MILES DAVIS/MOV/MilesDavisCS1 - copie.mov"
set film2 to "/Volumes/VolumeRaid/ENCODAGE/EXPO/MILES DAVIS/MOV/MilesDavisCS1.mov"
tell application "QuickTime Player"
    open film1
    open film2
    activate
    present document 1 scale screen display 1
    present document 2 scale screen display 2
    rewind document 1
    rewind document 2
    stop
    start
end tell

Merci


----------



## two (2 Avril 2009)

hello,
a première vue je changerais l'ordre de la fin de ton script


matmateo a dit:


> set film1 to "/Volumes/VolumeRaid/ENCODAGE/EXPO/MILES DAVIS/MOV/MilesDavisCS1 - copie.mov"
> set film2 to "/Volumes/VolumeRaid/ENCODAGE/EXPO/MILES DAVIS/MOV/MilesDavisCS1.mov"
> tell application "QuickTime Player"
> open film1
> ...


je remplacerais par ceci (changement de la place du stop)

```
set film1 to "/Volumes/VolumeRaid/ENCODAGE/EXPO/MILES DAVIS/MOV/MilesDavisCS1 - copie.mov"
set film2 to "/Volumes/VolumeRaid/ENCODAGE/EXPO/MILES DAVIS/MOV/MilesDavisCS1.mov"
tell application "QuickTime Player"
    open film1
    open film2
    activate
    present document 1 scale screen display 1
    present document 2 scale screen display 2
stop
    rewind document 1
    rewind document 2
    start
end tell
```
juste parce qu'entre tes 2 rewind et ton stop le le document 1 avait le temps de prendre un peu d'avance


----------



## matmateo (3 Avril 2009)

Oui c'est exactement ca, et ca parait logique.
Merci
Une autre question, pour aller un peu plus loin, est ce que tu sais si c'est possible de créer une commande qui permet aux vidéos de se synchroniser à l'image près et ce durant toute la durée du film.
En effet le script actuel synchronise au démarrage mais j'ai peur qu'au bout de trois heures de boucle les films ne soit plus synchro.
L'idée serait de définir un film comme master, le second comme esclave. Ainsi, si on mettait pose sur le master, l'esclave se mettrait aussi en pose..
Peut etre s'agit il de fonctions trop avancé pour appelscript?

et deuxièmement est t il possible de lancer l'appelscript avant le démarrage de la session, ainsi il n'y aurait aucun élément de osx succeptible de faire planter la lecture.
Merci encore

---------- Nouveau message ajouté à 11h42 ---------- Le message précédent a été envoyé à 10h47 ----------

Encore une autre question (plus simple)
Ce script ne permet pas de jouer les films en boucle, comment faire pour y parvenir?
Merci


----------



## daffyb (3 Avril 2009)

est ce que les videos sont identiques ? parce que dans ce cas, une recopie video serait quand même plus simple non ?


----------



## two (3 Avril 2009)

matmateo a dit:


> Oui c'est exactement ca, et ca parait logique.
> Merci
> Une autre question, pour aller un peu plus loin, est ce que tu sais si c'est possible de créer une commande qui permet aux vidéos de se synchroniser à l'image près et ce durant toute la durée du film.
> En effet le script actuel synchronise au démarrage mais j'ai peur qu'au bout de trois heures de boucle les films ne soit plus synchro.
> ...


De rien 
perso là je n'en sais absolument rien... désolé


matmateo a dit:


> et deuxièmement est t il possible de lancer l'appelscript avant le démarrage de la session, ainsi il n'y aurait aucun élément de osx succeptible de faire planter la lecture.


en principe avant le démarrage de session les applescripts sont inopérants...


matmateo a dit:


> Encore une autre question (plus simple)
> Ce script ne permet pas de jouer les films en boucle, comment faire pour y parvenir?
> Merci


Là je peux répondre 
tu peux ajouter ceci dans ton script :
set looping of document 1 to yes
set looping of document 2 to yes

tu peux le mettre ou tu veux dans ton script après les 2 open film
toutefois je ne les mettrais pas après le start (histoire d'éviter un décalage - même si peu probable)


----------



## matmateo (12 Avril 2009)

L'idée est bien sur de synchroniser deux films différent mais de durée identique.
Merci pour ces réponses.


----------



## tatouille (14 Avril 2009)

matmateo a dit:


> L'idée est bien sur de synchroniser deux films différent mais de durée identique.
> Merci pour ces réponses.



tu dois faire ta propre appli, sinon tu perderas la sync a un moment ou a un autre
et quand tu dis start c'est pas dit que cela start sync


----------



## two (14 Avril 2009)

Ce que tu peux faire c'est une boucle dans ton script, pour que ta synchro reste du niveau du premier démarrage (qui n'es peut être pas parfaitement synchro comme le rappelle tatouille - mais le décalage devrait ne pas être perceptible, surtout si les vidéos ne sont pas les mêmes)

Tu supprime ce que je t'ai proposé dans mon dernier post et tu remplace la ligne "start" par


```
repeat
start
delay TonTempsEnSecondes
end repeat
```
le temps a mettre est celui de la vidéo, il sera peut être a adapter d'une seconde ou deux. Tu dois éviter que le start pour relancer la lecture de la vidéo ne se fasse alors que la vidéo n'est pas complètement achevée (auquel cas la commande start n'aurait pas d'effet et la vidéo, une fois achevée, s'arrêtera pour ne redémarrer qu'un start plus tard)  
le looping des documents tel que je te l'avais proposé créera d'office un décalage à la longue : tes vidéos, même si elle font en apparence le même temps, sont très certainement de durée légèrement différentes (sauf a les calibrer exactement au même nombre d'images - et encore je ne peux pas affirmer que même dans ce cas tu n'aie pas un décalage à la longue)


----------



## Anonyme (15 Avril 2009)

Bonjour,

*start*  ou *stop* ne fera rien, si vous ne spécifiez pas un document ou tous les documents.
EX: 
	
	



```
stop document 1
			play documents
			tell document 2
				start
			end tell
```
Oui, la commande start ou play ne synchronise pas les séquences, idem avec le menu "Lire toutes les séquences".

Voici un script qui synchronise deux séquences  avec un décalage de moins  d'un dixième de seconde, je l'ai testé ici avec moins de cinq centièmes de secondes.

```
property firstTime : false
property times_scale1 : 0
property times_scale2 : 0
property latence : 0
property t_movies : {}

on run
	set firstTime to true
end run

on idle
	if firstTime then
		openFilms()
	else
		tell application "QuickTime Player" to if exists document 2 then
			tell t_movies
				if not playing of item 1 then -- film 1 ne joue pas
					pause item 2 -- pause film 2
					set p to 0
				else
					set p to 1
					if not playing of item 2 then play item 2 -- film 1 joue et film 2 ne joue pas --> joue  film 2
				end if
			end tell
			set t_pos to current time of documents -- position des lecteurs
			set The_diff to (my milliieme((item 1 of t_pos) / times_scale1)) - (my milliieme((item 2 of t_pos) / times_scale2))
			if The_diff > 0.1 or The_diff < -0.1 then -- décalage de plus d'un dixième de seconde --> synchronise
				if p = 0 then -- les lecteurs sont en pause
					if times_scale2 = times_scale1 then
						set current time of item 2 of t_movies to (current time of item 1 of t_movies)
					else
						set current time of item 2 of t_movies to ((current time of item 1 of t_movies) / times_scale1) * times_scale2
					end if
				else if p = 1 then -- les lecteurs jouent
					repeat with i from 1 to 10 -- synchronise pendant la lecture
						set current time of item 2 of t_movies to (current time of item 1 of t_movies) + (latence * i)
						delay 3
						set t_pos to current time of documents
						set The_diff to (my milliieme((item 1 of t_pos) / times_scale1)) - (my milliieme((item 2 of t_pos) / times_scale2))
						if The_diff < 0.1 and The_diff > -0.1 then exit repeat --  synchro OK, moins d'un dixième de seconde , sort de la boucle 
					end repeat
				end if
			end if
		end if
	end if
	return 5 -- vérification aux 5 secondes
end idle

on openFilms()
	set film1 to "/Volumes/VolumeRaid/ENCODAGE/EXPO/MILES DAVIS/MOV/MilesDavisCS1.mov"
	set film2 to "/Volumes/VolumeRaid/ENCODAGE/EXPO/MILES DAVIS/MOV/MilesDavisCS1 - copie.mov"
	tell application "QuickTime Player"
		close documents saving no
		set t_movies to open {film1, film2}
		activate
		tell documents
			repeat until load state of item 1 is complete and load state of item 2 is complete
				delay 3
			end repeat
			set looping to true
			present item 1 scale screen display 2
			present item 2 scale screen display 1
			pause
			set {times_scale1, times_scale2} to time scale
			set current time to 0 -- met les lecteurs au début
			play
			delay 1
			set t_pos to current time -- position des lecteurs
			pause
			-- vérifie la diffférence de temps entre les deux films et ajuste la position du deuxième lecteur selon le temps de latence.
			set n to (my milliieme((item 1 of t_pos) / times_scale1)) - (my milliieme((item 2 of t_pos) / times_scale2))
			set latence to (n * times_scale2) div 1.3
			set current time of item 1 to 0
			set current time of item 2 to latence
			delay 1
			play
		end tell
	end tell
	set firstTime to false
end openFilms

on quit
	continue quit
end quit


on milliieme(n) -- retourne le nombre avec trois décimale
	return ((n * 1000) div 1) / 1000
end milliieme
```
Le script fait une vérification  à toutes les cinq secondes,  vous pouvez  l'ajuster selon vos préférences.

La séquence maître est le film de la variable film1 dans le script
Donc, si l'utilisateur met en pause la séquence maître, le script pausera l'autre séquence après sa prochaine vérification, même chose pour la lecture
Si l'utilisateur (avance ou recule) la position d'un des deux films, le script synchronisera après sa prochaine vérification des temps des lecteurs.

Ce script fonctionne avec un *idle*, donc il faut l'enregistrer au format "Progiciel" et cocher l'option "*Rester en arrière-plan*".
Ajouter l'application (le script) dans l'ouverture automatique à l'ouverture de votre session.  (Préférences -->comptes )

Editer : Le script  ne prend seulement que 1% sur le processeur ici.


----------



## royalwithcheese (11 Février 2010)

ALLELUIA !!!
Je suis tombé par hasard sur cette discussion en faisant des recherches sur le net pour synchro des videos. Et ce script c'est exactement ce qu'il me faut !!! Mais...oui il y a toujours un mais, mon probleme est plus compliqué. J'aimerais lancé 3 videos synchro sur 3 ordis différents reliés en réseau ethernet. Est-ce possible de programmer ça via Apple Script ?
Je n'y connais malheureusement rien en programmation, si il y a sur ce forum une ame charitable pour m'aider...
Merci pour vos lanternes.


----------



## biloserge (9 Mai 2011)

Bonjour, 
j'ai exactement le même problème: 3 vidéoprojections simultanées et synchronisées, en boucle,  à présenter pour une exposition artistique.

Sans connaissance en programmation je ne sais pas comment adapter le script donné plus haut par Mac_Jac...

Merci d'avance pour votre aide.


----------

