Premiers pas avec VCDImager

Premiers pas avec VCDImager

Août 2001, apparaît une nouvelle version de VCDImager, logiciel, gratuit, capable de créer vos disques VideoCD et SVCD ! Seule la manipulation, en ligne de commande DOS et à travers un fichier de paramétrage XML pouvait rebuter les plus courageux. Des interfaces (GUI, Graphic User Interface ) de pilotage sous Windows deviennent disponibles. Elles visent à masquer la création de ce fichier XML. Vous découvrirez cependant que ce n'est pas si compliqué que cela ... grâce à Fabrice.

A vous vos vidéos et photos sur votre lecteur DVD quel que soit l’environnement de votre machine. VCDImager fonctionne en effet également sous Mac, Linux, ...

 Logiciel requis

- VCD Imager, outils gratuit page du logiciel, la version 0.7.1, le manuel en PDF
- Des vidéos Mpeg pour un VCD et Mpeg2 pour un SVCD (lire les pages de ce site)
- Un encodeur Mpeg ou Mpeg2 (ici j’utiliserais TPMGEnc 1.2 a) pour encoder les fichiers de menu au format bmp
- CDRwin pour graver votre VCD / SVCD (version d’évaluation sur ce site)

VCDImager est un petit programme qui comporte plusieurs modules. Ici nous verrons comment réaliser des VCD ou SVCD avec sont module VCDXBuild.
La description du VCD (ou SVCD) se fait à l’aide d’un fichier au format XML respectant plusieurs règles simples. Ensuite il suffit de taper une petite ligne de commande et l’image du CD est générée sur le disque dur. Il n’y a plus qu’à graver le tout et vous pouvez visualiser votre création.

Remarque : pour la suite de cet article, lorsque j’emploierais le terme VCD cela est aussi valable pour les SVCD.

Sommaire

- Qu’est-ce que le XML ?
- Séquence / segment
- Un premier VCD
- Un VCD avec un menu simple
- Un VCD avec une séquence chapitrée
- Un VCD avec séquence d’intro

Qu’est ce que le XML ?

Le XML (Extanded Markup Language) est un langage de description qui ici nous sert à décrire l’architecture et la navigation dans le VCD.
Un fichier XML peut être créé à partir d’outils spécifiques tels que Xmetal, XML Spy, mais vous pouvez sans aucun problème le créer à partir du « bloc note » de Windows car ce n’est qu’un simple fichier texte avec l’extension « .xml »
Ce fichier contient un ensemble de balises qui sont délimités par les signes < et >.

Exemple de balise :
<MA BALISE>

En général une balise doit être « fermée ». Il y a deux méthodes pour les fermer :
- On répète la même balise en mettant un / juste après le <
- On met un / juste avant le >

Exemple :

<MA BALISE></MA BALISE>
ou
<MA BALISE />

On peut utiliser la notation que l’on veut si le contenu de la balise est vide, c’est à dire qu’il n’y a rien à l’intérieur. Pour une meilleure lisibilité je vous conseille d’utiliser, pour commencer la notation <EX></EX>.

Exemple :

Balise vide : <MA BALISE></MA BALISE> ou <MA BALISE />
Balise non vide : <MA BALISE>bla bla bla</MA BALISE>

Dans certaines balises on peut trouver ce que l’on appelle des « arguments ». Ils servent dans la plupart des cas à identifier un élément ou à préciser une action à effectuer avec cet élément. Si vous ne voyez pas du tout à quoi cela sert ne vous inquiétez pas, ça va venir dès que l’on créera le premier VCD.

Un attribut se note de la façon ATTRIBUT=« Valeur »

Exemple :

<MA BALISE ID="identifiant"></MA BALISE>

Voilà pour la syntaxe à appliquer, maintenant nous allons voir les éléments qui composent la description du VCD.

 Séquence/Segment

Un VCD est constitué (entre autre) de « séquences » et de « segments », ce sont en fait les fichiers Mpeg que vous avez encodés et qui apparaîtront sur le VCD. La différence entre ces deux notions réside dans leur placement dans la structure du VCD et de leur utilisation. Un VCD réalisé avec VCDImager peut contenir 98 séquences et 1980 segments.

Nous verrons plus tard qu’il est possible de créer des vidéos avec des chapitres. Ce chapitrage ce fait uniquement sur des séquences Mpeg et non sur des segments.

Un VCD doit contenir au minimum une séquence. Il n’est pas obligé d’avoir de segments.

Une séquence est décrite à l’aide de la balise  :

On remarque que cette balise possède deux attributs : « src » et « id ».
« src » correspond au chemin sur votre disque dur de votre vidéo.
« id » est l’identifiant qui servira à appeler votre séquence vidéo. Vous pouvez mettre ce que vous voulez dans le contenu de l’attribut « id » à l’exception d’accents, d’espaces, et de caractères spéciaux (\, /,...)
Je vous conseil de nommer de clairement cet attribut, cela vous facilitera une relecture de la structure du VCD.

Vous pouvez donc mettre plusieurs séquences dans votre VCD. L’ensemble de ces séquences est entouré par des balises

Exemple :

<sequence-items>
   <sequence-item src="c:\vcd\video01.mpg" id="video-01"/>
   <sequence-item src="c:\vcd\video02.mpg" id="video-02"/>
</sequence-items>

Pour les segments, nous avons une syntaxe similaire :
<segment-items>
   <segment-item src="c:\vcd\video03.mpg" id="video-04"/>
   <segment-item src="c:\vcd\video04.mpg" id="video-05"/>
</segment-items>

« src » est toujours le chemin de votre vidéo, et « id » un nom que vous donnez à cette vidéo pour pouvoir l’identifier dans le fichier XML.

Nous voilà prêt à créer notre premier VCD.

 Un premier VCD

Pour créer notre premier VCD nous allons prendre une vidéo et la jouer, tout simplement.

Voici le code qui effectue cette opération : (à télécharger ici)

<?xml version="1.0"?>
<!DOCTYPE videocd PUBLIC "-//GNU//DTD VideoCD//EN" "http://www.gnu.org/software/vcdimager/videocd.dtd">
<videocd xmlns="http://www.gnu.org/software/vcdimager/1.0/" class="vcd" version="2.0">
<info>
   <album-id>Test</album-id>
   <volume-count>1</volume-count>
   <volume-number>1</volume-number>
</info>
<pvd>
   <volume-id>Test_1</volume-id>
   <system-id>CD-RTOS CD-BRIDGE</system-id>
</pvd>
<sequence-items>
   <sequence-item src="c:\vcd\video01.mpg" id="video-01"/>
</sequence-items>
<pbc>
   <playlist id="play-video-01">
   <wait>0</wait>
   <play-item ref="video-01"/>
   </playlist>
</pbc>
</videocd>

Le code commence toujours par :

{<?xml version="1.0"?>
<!DOCTYPE videocd PUBLIC "-//GNU//DTD VideoCD//EN" "http://www.gnu.org/software/vcdimager/videocd.dtd">
<videocd xmlns="http://www.gnu.org/software/vcdimager/1.0/" class="vcd" version="2.0">

Vous pouvez changer les paramètres de la dernière ligne, selon le cas ou vous voulez réaliser un VCD ou un SVCD.
Pour un VCD :

<videocd xmlns="http://www.gnu.org/software/vcdimager/1.0/" class="vcd" version="2.0">}

Pour un SVCD :

<videocd xmlns="http://www.gnu.org/software/vcdimager/1.0/" class="svcd" version="1.0">}

Ensuite nous avons la partie <info> qui regroupe toutes les informations du VCD :
- <album-id> : nom de l’album.
- <volume-count> : nombre de CD qui constitue l’album. Ici nous n’avons qu’une vidéo qui est stockée sur le CD et ne dépasse pas la taille de celui-ci.
-  : numéro du CD. Si notre album était constitué de plusieurs CD nous aurions <volume-number>1</volume-number> pour le premier CD et <volume-number>2</volume-number> pour le deuxième.

En dessous nous avons la balise qui englobe plusieurs balises à son tour :
-  : dans cette balise nous trouvons le nom du CD, qui apparaît dans l’explorateur de Windows. Le nombre de caractère est limité à 32.
- <system-id> : sert à rendre le VCD compatible CD-i. Il faut garder la valeur CD-RTOS CD-BRIDGE.

Ensuite nous retrouvons notre séquence vidéo :

<sequence-items>
   <sequence-item src="c:\vcd\video01.mpg" id="video-01"/>
</sequence-items>}

Suit enfin la partie qui représente la navigation à travers le VCD.
Pour cet exemple nous jouons donc la vidéo identifiée par le nom « video-01 » grâce à la ligne :

<play-item ref="video-01"/>

Dans l’attribut « ref » nous retrouvons l’identifiant de notre vidéo, à savoir « video-01 »

Cette balise est contenue dans une balise qui contient un attribut id. Cet attribut nous servira à repérer toutes les actions rattachées à la lecture de cette vidéo (séquence suivante, précédente,...). Ce nom doit être unique.

Conseil : nommez vos vidéos qui sont dans une balise <playlist> « play-xxx » et les vidéos qui sont contenus dans des balises (voir VCD avec menu) « selec-xxx », où xxx est le même nom que l’identifiant de votre vidéo.
Ici notre vidéo à l’identifiant « video-01 ». L’identifiant qui apparaît dans est donc « play-menu-01 ».

<wait>0<wait>

indique que nous jouons immédiatement la vidéo.

Une fois ce fichier réalisé, sauvegardez le sur votre disque dur, par exemple sur « c :\testvcd » avec le nom « test.xml ». L’extension de ce fichier doit obligatoirement être xml.
Dans ce répertoire copiez tous les fichiers de VCDImager. Ensuite il faut passer en ligne de commande : cliquez sur « Démarrer » puis « Exécuter », tapez « Command ». Il vous faut vous positionner dans le répertoire « c :\testvcd\ ».

Tapez ensuite :
vcdxbuild test.xml

Votre image CD sera créée dans le répertoire courrant sous le nom « videocd.cue ». Vous pouvez changer ce nom en tapant la ligne de commande :
Vcdxbuild -c nomCD.cue -b nomCD.bin test.xml

Il ne reste plus qu’à graver l’image avec CD-RWin

image 314 x 139

 Un VCD avec un menu simple

Dans ce deuxième exemple nous allons voir comment réaliser un menu dans lequel on pourra choisir entre deux vidéos avec les touches 1 et 2 de la télécommande. Lors de la lecture d’une des vidéos il sera possible d’utiliser les touches « suivant », « précédent » et « retour ».
Pour cela il nous faut :
- deux vidéos
- une image de menu au format mpeg (pour cela encodez un fichier .bmp dans TMPGEnc avec les dimensions 704*576 pour être en plein écran et à la résolution maximale).

Description de la navigation :

image 300 x 300

Voici le code pour réaliser un tel VCD : (à télécharger ici)

<?xml version="1.0"?>
<!DOCTYPE videocd PUBLIC "-//GNU//DTD VideoCD//EN" "http://www.gnu.org/software/vcdimager/videocd.dtd">
<videocd xmlns="http://www.gnu.org/software/vcdimager/1.0/" class="vcd" version="2.0">
<info>
   <album-id>Menu</album-id>
   <volume-count>1</volume-count>
   <volume-number>1</volume-number>
</info>
<pvd>
   <volume-id>Menu_1</volume-id>
   <system-id>CD-RTOS CD-BRIDGE</system-id>
</pvd>
<segment-items>
   <segment-item src="c:\vcd\menu.mpg" id="menu"/>
</segment-items>
   <sequence-items>
   <sequence-item src="c:\vcd\video01.mpg" id="video-01"/>
   <sequence-item src="c:\vcd\video02.mpg" id="video-02"/>
</sequence-items>
<pbc>
   <selection id="selec-menu">
       <bsn>1</bsn>
       <prev ref="selec-menu"/>
       <next ref="selec-menu"/>
       <return ref="selec-menu"/>
       <default ref="play-video-01"/>
       <timeout ref="play-video-01"/>
       <wait>-1</wait>
       <loop jump-timing="delayed">1</loop>
       <play-item ref="menu"/>
       <select ref="play-video-01"/>
       <select ref="play-video-02"/>
   </selection>
   <playlist id="play-video-01">
       <prev ref="selec-menu"/>
       <next ref="play-video-02"/>
       <return ref="selec-menu"/>
       <wait>0</wait>
       <play-item ref="video-01"/>
   </playlist>
   <playlist id="play-video-02">
       <prev ref="play-video-01"/>
       <next ref="selec-menu"/>
       <return ref="selec-menu"/>
       <wait>0</wait>
       <play-item ref="video-02"/>
   </playlist>
</pbc>
</videocd>

Le début du fichier ne change pas.

Notre menu se trouve dans la partie avec pour identifiant :
- « menu » pour le menu.
Dans <sequence-items> nous avons la définition de nos deux vidéos avec les identifiant suivant :
- « video-01 » pour la première vidéo
- « video-02 » pour la deuxième

Dans la partie <pbc> nous trouvons une balise <selection> qui correspond au menu et deux balises <playlist> qui correspondent aux deux vidéos.
Chacune de ces balises à un identifiant :
- « selec-menu » pour la partie menu
- « play-video-01 » pour la vidéo 1
- « play-video-02 » pour la vidéo 2
- 
Nous allons nous intéresser tout d’abord aux balises <playlist>.
Pour la première vidéo, lorsque l’on appuis sur la touche « précédent » on souhaite retourner au menu. Il suffit de mettre dans la balise la ligne suivante :
<prev ref="selec-menu"/>
« prev » correspond à la touche « précédente » de la télécommande, et l’attribut « ref » à l’identifiant de la partie Menu. On ne doit pas mettre directement l’identifiant de la vidéo Menu, mais l’identifiant du « playlist » ou « selection » qui contient la vidéo du menu. Dans notre cas c’est l’identifiant de la balise <selection> « selec-menu ».

En appuyant sur la touche « suivant » on veut passer à la deuxième vidéo :
<next ref="play-video-02"/>
« next » correspond à la touche « suivante » de la télécommande. Dans l’attribut « ref » on retrouve l’identifiant du « playlist » de la vidéo 2.

En appuyant sur la touche « retour » on veut retourner au menu :
<return ref="selec-menu"/>
« return » correspond à cette touche. Dans l’attribut « ref » on retrouve l’identifiant du « selection » de la vidéo du menu.

<wait>0</wait> signifie qu’il n’y a pas de délais après avoir joué la vidéo pour retourner au menu.

Enfin nous avons l’appel de la vidéo à jouer :
<play-item ref="video-01"/>

Pour le deuxième « playlist » qui porte l’identifiant « play-video-02 » nous utilisons les mêmes balises :
- <prev ref="play-video-01"/> pour revenir à la vidéo 1 lorsque l’on appuie sur la touche « précédent »
- <next ref="selec-menu"/> pour aller au menu quand on appuie sur la touche « suivant »
- <return ref="selec-menu"/> pour aller au menu quand on appuie sur la touche « retour »
- <wait>0</wait> pour aller directement à l’identifiant suivant, ici « selec-menu »
- <play-item ref="video-02"/> pour préciser de jouer la vidéo 2

Maintenant le plus intéressant, le menu.
- <bsn>1</bsn> signifie qui la sélection à numérique à partir de la télécommande commence à 1.
- Ensuite on a les balises , et que nous avons déjà vu. Si on appuie sur l’une d’entre elle on reste sur le menu
- <default ref="play-video-01"/> corresponds à l’appuis sur la touche « play ». Quand on appuie sur « play » on va sur le « playlist » « play-video-01 » qui corresponds à la lecture de la vidéo numéro 1.
- <wait>-1</wait> signifie que l’on boucle indéfiniment
- <loop jump-timing="delayed">1</loop> signifie que la séquence est jouée une fois et que l’on attends qu’une action se produise (« jumping-timing=« delayed » »)
- <play-item ref="menu"/> indique que la vidéo à jouer est « menu ».
- les balises <select> qui suivent représentent les choix possibles de ce menu. Etant donné que la sélection numérique commence à 1 (<bsn>1</bsn>) si on appuie sur 1 on joue la partie « play-video-01 » (qui correspond à la lecture de la première vidéo), et si on appuie sur 2 on joue la partie « play-video-02 ».

Enregistrer ce fichier (menu.xml) dans le répertoire ou se trouve VCDImager et générez l’image du CD grâce à la ligne de commande : vcdxbuild menu.xml

 Un VCD avec une séquence chapitrée

Il est possible de faire un VCD (ou SVCD) avec des vidéos chapitrées.
Pour cela il vous faut
- une page de menu
- une vidéo et savoir à quel moment créer un nouveau chapitre.

Le reste est extrêmement simple.

Description de la navigation :

image 300 x 510

Voici le code d’un VCD contenant une vidéo avec 3 chapitres : (à télécharger ici)

<?xml version="1.0"?>
<!DOCTYPE videocd PUBLIC "-//GNU//DTD VideoCD//EN" "http://www.gnu.org/software/vcdimager/videocd.dtd">
<videocd xmlns="http://www.gnu.org/software/vcdimager/1.0/" class="vcd" version="2.0">
<info>
   <album-id>Chapitre</album-id>
   <volume-count>1</volume-count>
   <volume-number>1</volume-number>
</info>
<pvd>
   <volume-id>Chapitre_1</volume-id>
   <system-id>CD-RTOS CD-BRIDGE</system-id>
</pvd>
<segment-items>
   <segment-item src="c:\vcd\menu.mpg" id="menu"/>
</segment-items>
<sequence-items>
   <sequence-item src="c:\vcd\video01.mpg" id="video-01">
   <entry id="video01-ent01">5.00</entry>
       <entry id="video01-ent02">10.00</entry>
       <entry id="video01-ent03">15.00</entry>
   </sequence-item>
</sequence-items>
<pbc>
   <selection id="selec-menu">
       <bsn>1</bsn>
       <prev ref="selec-menu"/>
       <next ref="selec-menu"/>
       <return ref="selec-menu"/>
       <default ref="play-video-01"/>
       <timeout ref="play-video-01"/>
       <wait>-1</wait>
       <loop jump-timing="delayed">1</loop>
       <play-item ref="menu"/>
       <select ref="play-video-01"/>
       <select ref="play-video01-ent01"/>
       <select ref="play-video01-ent02"/>
       <select ref="play-video01-ent03"/>
   </selection>
   <playlist id="play-video-01">
       <prev ref="selec-menu"/>
       <next ref="play-video01-ent01"/>
       <return ref="selec-menu"/>
       <wait>0</wait>
       <play-item ref="video-01"/>
   </playlist>
   <playlist id="play-video01-ent01">
       <prev ref="play-video-01"/>
       <next ref="play-video01-ent02"/>
       <return ref="selec-menu"/>
       <wait>0</wait>
       <play-item ref="video01-ent01"/>
   </playlist>
   <playlist id="play-video01-ent02">
       <prev ref="play-video01-ent01"/>
       <next ref="play-video01-ent03"/>
       <return ref="selec-menu"/>
       <wait>0</wait>
       <play-item ref="video01-ent02"/>
   </playlist>
   <playlist id="play-video01-ent03">
       <prev ref="play-video01-ent02"/>
       <next ref="selec-menu"/>
       <return ref="selec-menu"/>
       <wait>0</wait>
       <play-item ref="video01-ent03"/>
   </playlist>
</pbc>
</videocd>

Dans la partie <sequence-items> on retrouve la balise <sequence-item> du menu et une balise . On remarque que cette dernière balise n’est pas vide, donc il ne faut pas mettre de / après le >.
Cette balise contient toujours les attributs « src » et « id » pour indiquer le chemin de la vidéo et son identifiant. De plus elle contient plusieurs balise <entry> qui sont des points d’entrées de cette vidéo. Chaque balise <entry> à un identifiant qui à la même fonction que les autres identifiant utilisés précédemment. Dans cette balise nous trouvons donc un point d’encrage sur la vidéo exprimé en secondes. Chaque point d’entré ainsi créé permettra de faire un renvois vers cette partie de la vidéo à partir d’un « selection » ou d’un « playlist ».
Lorsque l’on fait un revoie vers un point de la vidéo, la lecture commence à partir de ce point et jusqu’au bout de la vidéo (sauf si on appuie sur une touche).

Dans la partie <pbc> on arrive sur la partie page de menu qui propose 4 choix (et commence par 1 :

<bsn>1</bsn>) :
play-video-01
play-video01-ent01
play-video01-ent02
play-video01-ent03

Si on regarde le <playlist> « play-video-01 » on voit que l’on joue la vidéo « video-01 ».
Si on clique sur la touche 2, on est renvoyé sur le « play-video01-ent01 ». Si on regarde dans cette balise la balise <play-item> on remarque que sa référence est un des points d’entrée de la vidéo. La lecture commence donc à partir de ce point et jusqu’à la fin. Si on appuie sur suivant, on effectue ce qu’il y a dans la balise <next>, c’est à dire on se dirige vers la partie « play-video01-ent02 » qui pointe vers le deuxième point d’encrage de la vidéo.

 Un VCD avec une séquence d’intro

Un VCD avec une séquence d’intro est un VCD avec un <playlist> qui lit la vidéo d’intro et qui est placé juste après la balise <pbc>. Dans la balise <next> on indique l’identifiant du menu à afficher juste après l’intro (ici « selec-menu »).

Description de la navigation :

image 300 x 381

Voici le code XML : (à télécharger ici)

<?xml version="1.0"?>
<!DOCTYPE videocd PUBLIC "-//GNU//DTD VideoCD//EN" "http://www.gnu.org/software/vcdimager/videocd.dtd">
<videocd xmlns="http://www.gnu.org/software/vcdimager/1.0/" class="vcd" version="2.0">
<info>
   <album-id>intro</album-id>
   <volume-count>1</volume-count>
   <volume-number>1</volume-number>
</info>
<pvd>
   <volume-id>intro_1</volume-id>
   <system-id>CD-RTOS CD-BRIDGE</system-id>
</pvd>
<segment-items>
   <segment-item src="c:\vcd\menu.mpg" id="menu"/>
   <segment-item src="c:\vcd\video02.mpg" id="intro"/>
</segment-items>
<sequence-items>
   <sequence-item src="c:\vcd\video01.mpg" id="video-01" />
</sequence-items>
<pbc>
   <playlist id="play-intro">
       <prev ref="selec-menu"/>
       <next ref="selec-menu"/>
       <return ref="selec-menu"/>
       <wait>0</wait>
       <play-item ref="intro"/>
   </playlist>
   <selection id="selec-menu">
       <bsn>1</bsn>
       <prev ref="selec-menu"/>
       <next ref="selec-menu"/>
       <return ref="selec-menu"/>
       <default ref="play-video-01"/>
       <timeout ref="play-video-01"/>
       <wait>-1</wait>
       <loop jump-timing="delayed">1</loop>
       <play-item ref="menu"/>
       <select ref="play-video-01"/>
   </selection>
   <playlist id="play-video-01">
       <prev ref="selec-menu"/>
       <next ref="selec-menu"/>
       <return ref="selec-menu"/>
       <wait>0</wait>
       <play-item ref="video-01"/>
   </playlist>
</pbc>
</videocd>

Vos questions sont bienvenues pour compléter/améliorer ce guide !