Blog-like notes

Inclure une vidéo dans un PDF

Cette note a également été publiée sur linuxfr.org le 11 novembre 2013.

Lorsque je présente mes travaux lors d’un meeting ou d’un séminaire, j’ai souvent besoin de présenter des vidéos. N’étant pas grand fan de LibreOffice Impress (encore moins de Microsoft PowerPoint), plutôt adepte de Beamer, j’ai voulu faire le point sur l’art et la manière d’inclure une vidéo dans un fichier PDF.

Le format PDF et les vidéos

Il existe trois façons d’intégrer une vidéo au sein d’un document PDF.

Les Movie annotations

La première méthode a été introduite dans la version 1.2 du format PDF, sous la forme du type d’annotation « Movie » (une annotation, dans le jargon PDF, désigne toutes sortes d’objets avec lesquels l’utilisateur peut interagir).

Il s’agit a priori de la méthode la plus simple. Elle consiste en une seule annotation contenant un lien vers la vidéo (il peut s’agir d’un lien vers un fichier externe ou, à partir de PDF 1.3, d’un lien vers un fichier inclus directement dans le fichier PDF) et quelques paramètres contrôlant son affichage (taille, aspect, rotation, affichage ou non de boutons de lecture/pause, etc.).

Voici un exemple d’une telle annotation :

1 0 obj <<
  /Type /Annot
  /Subtype /Movie
  /Rect [x1 y1 x2 y2]         % emplacement de la vidéo sur la page
  /Movie << /F (video.avi) >> % lien vers le fichier
  /A << /ShowControls true >> % paramètres d’affichage (ici, on demande l’affichage des boutons de contrôle)
>> endobj

Les Screen annotations

La seconde méthode repose sur les fonctionnalités multimédia introduites dans PDF 1.5, et plus particulièrement l’annotation de type « Screen ».

Cette méthode est plus complexe et nécessite au moins quatre objets distincts. D’abord, l’annotation « Screen » proprement dite :

1 0 obj <<
  /Type /Annot
  /Subtype /Screen
  /Rect [x1 y1 x2 y2] % emplacement de l’annotation
  /P page 0 R         % référence à la page à laquelle l’annotation est rattachée
  /T (Titre du film)  % indicatif uniquement
  /A 2 0 R            % référence vers un « dictionnaire d’actions »
>> endobj

Le « dictionnaire d’actions » indique le comportement à adopter lorsque l’utilisateur interagit avec l’annotation. Voici le plus simple exemple, où l’on demande un comportement élémentaire (cliquer sur l’annotation déclenche la lecture, cliquer à nouveau met en pause) :

2 0 obj <<
  /Type /Action
  /S /Rendition
  /R 3 0 R  % référence vers un objet de type « Media Rendition »
  /AN 1 0 R % référence inverse vers l’annotation « Screen »
  /OP 0     % comportement standard (cliquer pour lire/arrêter)
>> endobj

Le dictionnaire d’actions peut être plus complexe et permet notamment l’utilisation de Javascript pour coder les actions de son choix.

L’objet « MediaRendition », référencé dans le dictionnaire d’actions, indique au minimum le média à jouer, et optionnellement comment le jouer :

3 0 obj <<
  /Type /Rendition
  /S /MR
  /C 4 0 R    % référence vers un objet « Media Clip Data »
  /P  << /Type /MediaPlayParams ... >>    % options de lecture
  /SP << /Type /MediaScreenParams ... >>  % options d’affichage
>> endobj

Enfin, l’objet « Media Clip Data » représente le média à jouer proprement dit (ici, sous la forme d’un lien vers un fichier externe, mais ça pourrait être une référence vers un fichier inclus dans le PDF) :

4 0 obj <<
  /Type /MediaClip
  /S /MCD
  /D (video.avi)  % lien vers le fichier vidéo
  /CT (video/avi) % type MIME
>> endobj

Les Rich Media annotations

La troisième méthode a été introduite par Adobe Acrobat 9. C’est une méthode encore plus complexe que la précédente (raison pour laquelle je ne fournirai pas d’exemple), mais en résumé, le principe consiste à confier la lecture de la vidéo à un lecteur Flash qui sera lui-même inclus dans le fichier PDF. C’est grosso modo la transposition dans les visionneurs PDF de ce qui se fait déjà dans les navigateurs web, et comme pour les navigateurs, cela nécessite que les visionneurs PDF soient capables d’exécuter du Flash.

(Vous pensiez être débarassé du plugin Flash de votre navigateur avec HTML5 ? Tel Saruman qui chassé d’Isengard réapparait dans la Comté, le voici qui revient dans votre visionneur PDF…)

Les deux premières méthodes (Movie et Screen annotations) font partie de la version standardisée du format PDF (PDF 1.7, aka ISO3200-1:2008), bien que la première y soit officiellement déclarée comme dépréciée en faveur de la seconde. La troisième méthode (Rich Media annotation) est documentée dans une extension de Adobe à la norme ISO3200 (PDF 1.7 Extension Level 3), mais non standardisée.

Générer un PDF avec vidéo(s) intégrée(s)

Maintenant qu’on sait ce qu’offre le format PDF, comment fait-on, concrètement, pour produire un PDF contenant des vidéos ?

Je parlerai essentiellement de LaTeX, parce que c’est ce que j’utilise et que ça fonctionne. Je dirai également deux mots de ce qui est supposé fonctionner avec DocBook.

LaTeX

Il existe au moins trois paquets LaTeX permettant d’inclure une vidéo, chacun supportant l’une des trois méthodes décrites ci-dessus.

Le paquet multimedia, écrit par Till Tantau (aussi auteur de beamer, les deux paquets sont d’ailleurs distribués ensemble et la documentation de multimedia est incluse dans celle de beamer, même si chaque paquet peut être utilisé de façon indépendante), génère des Movie annotations conformes au format PDF 1.2.

\usepackage{multimedia}
…
\movie[showcontrols,poster,width=4cm,height=2cm]{}{video.avi}

À noter que multimedia n’inclut pas physiquement le fichier vidéo dans le fichier PDF (ce qui n’est possible qu’à partir de PDF 1.3). Le fichier vidéo doit donc accompagner le fichier PDF pour que le visionneur PDF ait une chance de le trouver.

Le paquet movie15, écrit par Alexander Grahn, génère des Screen annotations conformes au format PDF 1.5.

\usepackage{movie15}
…
\includemovie[controls,poster]{4cm}{2cm}{video.avi}

Contrairement au paquet précédent, la vidéo est ici réellement incluse dans le fichier PDF. De plus, movie15 génère aussi une File Attachment annotation qui permet, dans les visionneurs PDF qui supportent ce type d’annotation, d’offrir à l’utilisateur la possibilité d’extraire facilement le fichier inclus (autrement qu’en ayant recours à des outils comme pdfannotextract ou poppler-glib-demo).

Enfin, le paquet media9, écrit par le même Alexander Grahn, génère des Rich Media annotations compatibles avec Adobe Reader 9 et suivants.

\usepackage{media9}
…
\includemedia[%
  addresource=video.avi,
  flashvars={source=video.avi}]{}{VPlayer.swf}

(Avec tout le respect que j’ai pour Alexander Grahn, ne l’écoutez pas quand il dit que movie15 est obsolète et devrait être remplacé par media9. Vous l’aurez compris, les deux paquets ne sont pas du tout équivalents et le second ne peut pas être considéré comme une simple évolution du premier, puisqu’ils sont basés sur des méthodes d’inclusion complètement différentes — l’une standardisée, l’autre non.)

DocBook

Voici un exemple sorti tout droit du DocBook: The Definitive Guide :

<mediaobject>
  <videoobject>
    <videodata fileref="video.avi" />
  </videoobject>
  <imageobject>
    <imagedata fileref="fallback.png" />
  </imageobject>
  <textobject>
    <para>Si vous lisez ceci, quelque chose n’a pas fonctionné…</para>
  </textobject>
</mediaobject>

Avec la chaîne de production que j’utilise pour les documents DocBook (source DocBook → traitement par DocBook XSL Stylesheets → source intermédiaire XSL-FO → traitement par Apache FOP → document PDF), ben… ça marche pô. Le document résultant contient l’image de secours, mais aucune trace de la vidéo. Il semble s’agir d’une limitation du format intermédiaire XSL-FO, qui apparemment ne permet pas l’inclusion de vidéos — en tout cas rien n’indique que la directive fo:external-graphic puisse être utilisée pour autre chose que des images fixes.

Lire un PDF avec vidéo(s) intégrée(s)

Maintenant qu’on sait produire un PDF contenant des vidéos, où peut-on le lire et avec quoi ? La réponse n’est malheureusement pas « sur n’importe quelle machine avec n’importe quel visionneur PDF. »

Adobe Reader

Adobe Reader sur Windows supporte les Screen annotations et, à condition d’avoir le plugin Flash installé, les Rich Media annotations. Les Movie annotations ne sont apparemment plus supportées.

Adobe Reader sous Mac OS X supporte les deux annotations standardisées, bien que la vidéo que j’ai testée s’est avérée illisible car dans un format « non-reconnu par QuickTime ». Du MPEG-4 Part 2 dans un conteneur AVI, ça ne me paraît pourtant pas très exotique comme format, mais bon… Quoi qu’il en soit, le problème n’est pas imputable au visionneur PDF lui-même, qui ne fait que se reposer sur les décodeurs vidéos de la plate-forme. Et les spécifications du format PDF ne disent rien du tout sur les formats vidéos supportés, chaque implémentation supportant ce qu’elle veut.

À noter qu’avec la méthode des Screen annotations, il devrait être possible d’inclure plusieurs versions d’une même vidéo dans des formats différents et laisser le visionneur choisir celle qu’il peut lire (à la manière de ce qu’il est possible de faire avec la balise video en HTML5), mais le paquet movie15 ne permet pas cela.

Adobe Reader sous Mac OS X devrait en principe supporter les Rich Media annotations, mais la version que j’ai testé plante irrémédiablement dès qu’on ouvre une page contenant une telle annotation.

Adobe Reader sous GNU/Linux ressemble à une plaisanterie (je ne parlerai même pas du fait que nous n’ayons droit qu’à une version 9.1 et quelques en 32 bits…). La lecture des Movie et Screen annotations nécessite de télécharger un « player multimédia » qui n’est pas inclus d’office. Pourquoi pas, mais là où ça devient amusant, c’est lorsque Reader tente effectivement de télécharger ledit player à cette adresse, et que le serveur de Adobe répond par un 403 Forbidden « Sorry, browsing is not allowed in this directory ». Traduction : « Utilisateurs de GNU/Linux, allez vous faire mettre. Cordialement, Adobe. »

Les Rich Media annotations ne sont pas davantage supportées, mais ça c’était attendu, le support de Flash dans les versions GNU/Linux de Reader ayant été explicitement laissé de côté (non pas que je le regrette). Mais chez Adobe, même le non-support est source de bug : l’ouverture d’une page contenant une Rich Media annotation fait planter le lecteur avec une « erreur d’analyse des données 3D ».

Les visionneurs libres

Le vénérable Xpdf, il fallait probablement s’y attendre, ne supporte aucune des trois formes d’inclusion vidéo.

La bibliothèque Poppler, dans sa version 0.24.2, reconnaît correctement les Movie annotations et les Screen annotations, soit les deux formes standardisées. Les Rich Media annotations ne sont pas supportées.

Mais le support par poppler ne suffit pas, il appartient ensuite aux visionneurs basés sur poppler de savoir quoi faire des annotations que leur renvoie la bibliothèque. À ce niveau, les fortunes sont variables :

MuPDF 1.2, un visionneur PDF non-basé sur poppler, ne reconnait aucune annotation — bien que la bibliothèque sous-jacente, développée expressément pour ce logiciel, semble capable de le faire.

Pour récapituler :

Visionneur Movie (PDF 1.2) Screen (PDF 1.5) Rich Media (PDF 1.7 ext.lev.3)
Adobe Reader (Windows) non oui oui (avec plugin Flash)
Adobe Reader (Mac OS) oui oui peut-être, quand ça plante pas
Adobe Reader (GNU/Linux) non non non
Xpdf non non non
Okular oui non non
Evince non oui (externe) non
Epdfview non non non
QPdfPresenterConsole non oui non
MuPDF non non non

Bilan provisoire

Au vu de ces constatations, j’ai pour l’instant choisi le paquet movie15. La sortie qu’il produit est standard et semble être la plus largement supportée, même si le problème du format de la vidéo (trouver un format visionnable partout) reste posé.

Si vous souhaitez tester la lecture de vidéo avec d’autres visionneurs, d’autres versions, sur d’autres plate-formes, je fournis une archive contenant trois fichiers PDF générés avec chacun des trois paquets LaTeX sus-mentionnés et utilisant donc les trois formes possibles d’inclusion. L’archive contient aussi le document DocBook, pour ceux qui voudraient tester une autre chaîne de production que celle passant par XSL-FO :

pdf-video-samples.zip (application/zip, 2.9M)