Mouviciel

Création d'applications pour Mac OS X

Les coulisses d'un développeur Mac

Combiner plusieurs séquences QuickTime en une seule

Publié le dimanche 9 novembre 2008, aucun commentaire

Cet article s'éloigne un peu de Cocoa et parle de vidéo interactive et de scripts Unix.

Je vous propose de créer une séquence vidéo lisible par QuickTime qui joue plusieurs vidéos contenues dans un dossier.

Les points de départ et d'arrivée

Au début, j'ai un dossier, par exemple DCIM/100MOUVI (vous aurez peut-être reconnu la structure des dossiers d'un appareil photo numérique), qui contient quelques vidéos .MOV en plus des photos .JPG.

J'aimerais regrouper toutes les vidéos ensemble de manière à pouvoir les visionner en séquence confortablement installé dans mon canapé, sans avoir à faire quelque manipulation pour passer d'une vidéo à l'autre. Bien sûr, je voudrais que l'opération de regroupement soit réalisée avec le moins de manipulations possibles. Je n'ai pas envie d'y consacrer trop de temps, surtout lorsque j'ai plusieurs dizaines de vidéos à monter.

La solution proposée : SMIL

Pour parvenir à cet objectif, je vous propose d'utiliser SMIL, un langage qui permet de décrire des assemblages de fichiers multimédia tels que photos, sons, vidéos ou texte. Un fichier SMIL est semblable à un fichier HTML par sa structure à balises. Il peut être ouvert avec QuickTime, Realplayer et quelques autres applications.

Pour parler concrètement, voici un petit exemple de fichier SMIL que vous pouvez ouvrir avec QuickTime :

<smil>
<head>

<layout>
    <root-layout width="800" height="450" background-color="gray" />
    <region id="main" width="100%" height="100%" fit="fill" />
</layout>

</head>
<body>

<seq>
<video region="main" src="/System/Library/CoreServices/Setup%20Assista
nt.app/Contents/Resources/TransitionSection.bundle/Contents/Resources/
intro.mov" />
</seq>

</body>
</smil>

Attention, le chemin du fichier vidéo doit être écrit sur une seule ligne. J'ai choisi celui-ci parce que je suis à peu près certain qu'il est présent sur n'importe quel système Leopard. Mais vous pouvez bien entendu choisir un de vos propres fichiers vidéo et donner son chemin soit depuis la racine comme je l'ai fait, soit de façon relative à partir de l'emplacement de votre fichier SMIL.

Un fichier SMIL est ainsi composé de deux parties, l'en-tête marqué par la balise <head>, et le corps marqué par la balise <body>.

L'en-tête contient toutes les informations de mise en page ou plutôt de mise en écran. Il définit la taille de l'écran et sa couleur de fond, avec la balise <root-layout>. Il définit aussi des régions de l'écran (balise <region>) dans lesquelles n'importe quel objet multimédia pourra prendre place.

Le corps décrit quels sont les objets multimédia qui sont à jouer (avec les balises <video>, <audio>, <image>, <text>, <textstream> et <animation>) et de quelle manière les synchroniser (avec les balises <seq> pour un enchaînement en séquence, et <par> pour jouer plusieurs objets simultanément : plusieurs vidéos dans plusieurs régions ou une image accompagnée d'une musique).

La construction de la séquence

Pour combiner plusieurs séquences en une seule, nous n'aurons besoin que de la balise <seq> pour définir une séquence et de la balise <video> pour identifier chaque séquence. Nous avons une seule région à définir et l'écran a des proportions 4/3 comme la plupart des appareils photo numériques et des webcams.

Je confie à un script shell la localisation des fichiers de séquence et la création du fichier SMIL associé. Ce script recherchera tous les fichiers .MOV présents dans un APN branché au Mac et créera un fichier SMIL LISTE.SMI à la racine de l'APN (c'est-à-dire dans le même dossier que le dossier DCIM).

Voici le script que je vous propose :

#!/bin/sh

# dcim2smil.sh
# dcim2smil
#
# Created by mouviciel on 07/11/08.
# Copyright 2008 Mouviciel. All rights reserved.


# Spécification du ou des dossiers à explorer. Ici il s'agit
# d'appareils photos numériques, vus par le Mac comme des volumes
# contenant un dossier DCIM à leur racine. Si aucun des dossiers
# spécifiés n'existe, le script se termine.

dossiers="/Volumes/*/DCIM"
ls ${dossiers}/. > /dev/null 2>&1 || exit


# Il est possible que plusieurs APN soient branchés en même temps.
# Chacun aura droit à sa LISTE.SMI. La liste tient compte de la
# possibilité d'espaces dans le nom de l'APN, comme par exemple
# le traditionnel "NO NAME".

listeAPN=`ls -d -1 ${dossiers} | sed 's/%/%25/g;s/ /%20/g'`

for apn in ${listeAPN}
do

    # Reconversion des espaces pour avoir des noms en clair
    dcim=`echo ${apn} | sed 's/%20/ /g;s/%25/%/g'`
    
    # Recherche de toutes les vidéos dans l'APN.
    cd "${dcim}"
    listeMOV=`find . -name '*.MOV' | sort`
    
    # Construction du fichier LISTE.SMI lorsque des MOV sont
    # présents dans l'APN. Si un fichier LISTE.SMI existe déjà,
    # le script abandonne et passe à l'APN suivant.
    test -f "LISTE.SMI" && continue
    test -z "${listeMOV}" && continue

    cat << EOF_SMIL > LISTE.SMI
<smil>
<head>
<layout>
<root-layout id="root"
 width="640" height="480"
 background-color="black" />
<region id="r"
 width="100%" height="100%"
 fit="fill" />
</layout>
</head>
<body>
<seq>
    
`echo "${listeMOV}" | sed 's:^:<video region="r" src=":;s:$:" />:'`
    
</seq>
</body>
</smil>
EOF_SMIL

done

En lançant ce script, vous parcourez l'ensemble des appareils photo numériques branchés à votre Mac à la recherche de séquences vidéo, et pour chacun vous créez un fichier LISTE.SMI que vous pouvez glisser sur l'icône de QuickTime Player pour jouer l'enchaînement de toutes les vidéos présentes dans l'appareil.

Vous pouvez bien entendu changer le dossier à explorer en modifiant la valeur de la variable dossiers. Par exemple, si vous voulez rechercher les vidéos qui sont sur votre bureau et dans les dossiers présents sur celui-ci, modifiez le script de la façon suivante :

dossiers="${HOME}/Desktop"
ls ${dossiers}/. > /dev/null 2>&1 || exit

Dans ce cas, il sera alors peut-être utile de prendre en compte les fichiers .mov en plus des .MOV voire d'autres formats tels que .m4v ou .avi. De même, il faudra peut-être aussi s'occuper des caractères spéciaux dans les noms des fichiers et des dossiers. La modification suivante illustre l'ajout de .mov et le traitement des espaces :

    # Recherche de toutes les vidéos dans l'APN.
    cd "${dcim}"
    listeMOV=`find . -name '*.MOV' -or -name '*.mov' \
              | sed 's/%/%25/g;s/ /%20/g' | sort`

Attention, la barre descendante est immédiatement suivie d'un retour à la ligne, sans espace ni tabulation. Elle indique que la commande n'est pas finie et se poursuit sur la ligne suivante.

QuickTime et SMIL

QuickTime ne connaît que la première version de SMIL, qui en est à la troisième à ce jour. C'est suffisant pour répondre à notre besoin présent. En contrepartie, QuickTime propose quelques extensions à cette première version, par exemple la possibilité de lancer la séquence automatiquement à l'ouverture ou bien celle de la jouer en plein écran.

Par exemple, si vous souhaitez faire démarrer la séquence dès son ouverture, vous pouvez modifier le script de la façon suivante :

    cat << EOF_SMIL > LISTE.SMI
<smil
xmlns:qt="http://www.apple.com/quicktime/resources/smilextensions"
qt:autoplay="true" >
<head>

La première ligne en gras active les extensions de QuickTime. Elle doit être présente chaque fois que vous souhaitez utiliser une de ces extensions. La deuxième ligne spécifie que la séquence vidéo doit être démarrée dès son ouverture. Si vous souhaitez en plus ouvrir le film en plein écran, voici la modification à ajouter aux lignes précédentes :

    cat << EOF_SMIL > LISTE.SMI
<smil
xmlns:qt="http://www.apple.com/quicktime/resources/smilextensions"
qt:fullscreen="full"
qt:autoplay="true" >
<head>

Ainsi, le film se lancera automatiquement à son ouverture, qui plus est en plein écran.

Pour aller plus loin

À propos du script shell, parmi les améliorations possibles vous pouvez par exemple intégrer les images .JPG en leur donnant une durée d'affichage. De cette façon, vous obtenez un diaporama.

À propos de SMIL, j'ai évoqué la possibilité de faire jouer des vidéos en parallèle dans plusieurs régions de l'écran. Il est possible aussi d'ajouter de l'interactivité en cliquant sur une région de l'écran pour faire jouer une partie prédéfinie du film, comme une sorte de DVD rudimentaire, ou bien pour ouvrir une application tierce qui ouvrira un autre fichier, du HTML avec Safari ou bien un flux vidéo avec QuickTime Player. Même si les possibilités restent limitées, il y a beaucoup de petits trucs qui peuvent être réalisés avec SMIL et QuickTime.

Commentaires

Soyez le premier à commenter cet article.

Ajoutez un commentaire

Les commentaires sont destinés à répondre en public à l'article visé et à ses commentaires déjà publiés. C'est pourquoi seul un pseudonyme vous est demandé ici. Si vous souhaitez échanger avec moi en privé, merci de me laisser un message via le menu contact en haut de la page.

Archive

Rubriques

Abonnement