Intégrer des vidéos dans des fichiers PDF

Posté par  . Édité par Florent Zara et rootix. Modéré par claudex. Licence CC By‑SA.
39
12
nov.
2013
Bureautique

Comme vous êtes demandeurs de howto/documentation, on pense à vous. Après l'invitation de RMS, héberger son propre courriel, voici l'intégration de vidéos dans un fichier PDF.

Lorsque je présente mes travaux lors d’un meeting ou d’un séminaire, j’ai parfois (souvent, en fait) besoin de présenter des vidéos. N’étant pas grand fan de LibreOffice Impress (encore moins, tu t’en doutes, de PowerPoint), plutôt adepte de Beamer, je me suis penché sur l’art et la manière d’inclure une vidéo dans un PDF. Afin que ça ne se perde pas, je te confie le résultat de cette inclinaison.

NdM : merci à gouttegd pour son journal.

Sommaire

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 nn 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 retour 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ébarrassé 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. Si vous utilisez d’autres outils pour produire des PDF et qu’ils permettent l’inclusion de vidéos, manifestez-vous dans les commentaires.

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 ne fonctionne pas. :( 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 (oui, je sais)

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, 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ée 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 (3.3), 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 :

  • Okular 0.4.13, le visionneur de KDE, lit les Movies annotations mais pas les Screen annotations. En revanche, il reconnait les File attachment annotations générées par movie15, ce qui fournit au moins une solution de repli (à défaut de pouvoir lire la vidéo, l’utilisateur se voit offrir la possibilité d’enregistrer le fichier vidéo vers son disque dur, où il peut ensuite le lire avec le lecteur de son choix).

  • Evince 3.4.0, le visionneur de Gnome, reconnait les Screen annotations. Il ne permet pas de les lire directement dans le PDF, mais lance un VLC externe pour cela (je n’ai pas regardé si on pouvait remplacer VLC par un autre lecteur). Il ne reconnait pas les Movie annotations.

  • Epdfview 0.1.8 ne reconnait rien du tout.

  • L’excellentissime QPdfPresenterConsole 2.5.13, spécialisé dans l’affichage de présentations, reconnait les Screen annotations. Il repose sur libvlc pour les lire, et la vidéo jouée s’affiche à son emplacement prévu sur la page, et non dans une fenêtre externe comme avec Evince. Incidemment, le seul défaut de QPdfPresenterConsole est d’être assez peu connu.

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) 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.

Aller plus loin

  • # «Bref…

    Posté par  . Évalué à 4. Dernière modification le 12 novembre 2013 à 19:10.

    … la prochaine fois je ferais en trucmuchepouetpouet.js avec des gifs animés.»

    Écrit en Bépo selon l’orthographe de 1990

  • # lien cassay

    Posté par  (site web personnel) . Évalué à 3.

    Le lien https://linuxfr.org/moderation/news/how-to-inviter-richard-stallman-a-une-conference concernant l'invitation de RMS ne fonctionne pas. Quand on tente d'y accéder en étant déconnecté, ça demande de se connecter. Quand on tente d'y accéder quand on est connecté, ça boucle infiniment entre https://linuxfr.org/compte/connexion
    et le lien original.

    pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

  • # Spoiler bordel !

    Posté par  . Évalué à 7.

    Ce n'est heureusement pas mon cas, mais il reste des gens qui n'ont pas encore lu le Seigneur des Anneaux. Pensez à eux, avant de dévoiler les rebondissements de l'intrigue comme ça.
    Sinon, dépêche très intéressante !
    Pour information, chez moi Evince ouvre la vidéo avec mplayer. Je pense qu'il se contente de faire un xdg-open sur le fichier, ce qui est à priori la méthode naturelle pour une application qui doit ouvrir un fichier qu'elle ne sait pas gérer elle-même. Mais c'est une application Gnome, et donc peut-être fait-il (elle ?) directement un gvfs-open.

    LinuxFr, parfois c'est bien de la MERDE : https://linuxfr.org/users/c2462250/journaux/ecriture-inclusive-feministes-et-wikipedia#comment-1793140

  • # Et Impress!ve ?

    Posté par  . Évalué à 1. Dernière modification le 12 novembre 2013 à 23:02.

    J'utilise régulièrement Impress!ve pour présenter mes pdf réalisés avec beamer.
    Je suis très curieux de savoir si l'inclusion de vidéo fonctionne avec (même si j'ai un gros doute).
    L'as-tu testé?

    Toff'

    • [^] # Re: Et Impress!ve ?

      Posté par  . Évalué à 7.

      L'as-tu testé?

      Non, mais vu que la page d’accueil annonce que le rendu est fait avec Xpdf ou Ghostscript, il est quasi-certain je pense que les vidéos ne sont pas supportées : Xpdf ne les gère pas et j’imagine mal Ghostscript (qui est un interpréteur de langage PostScript) le faire. Et si les développeurs avaient ajouté eux-mêmes le support des vidéos, ils en feraient certainement état parmi les features de leur logiciel.

      Par ailleurs, quand je lis ça dans la FAQ, ça ne m’impress!onne pas beaucoup :

      Unfortunately PyGame, the windowing API currently used by Impressive, does not contain any support for multi-monitor setups whatsoever. This means that you can't really tell Impressive on with monitor it shall run. On Linux, you can try to run it in windowed mode, move the window to the proper monitor and enable fullscreen mode there, but it isn't guaranteed that this works either.

      • [^] # Re: Et Impress!ve ?

        Posté par  . Évalué à 2.

        Impressive permet d'insérer des vidéos entres deux pages pdf et de les lires automatiquement avec mplayer. J'ai pu le tester sur windows et linux et ça marche.

  • # Okular

    Posté par  . Évalué à 3.

    Je viens de tester avec okular 0.15.5, il lit les movie annotations et les screen annotations, le support des screen annotations a du être rajouté récemment.

    • [^] # Re: Okular

      Posté par  . Évalué à 3.

      Je viens de tester avec Okular 0.16.5 et il ne me lit pas les screen annotation (mais bien les movie annotation, ce n'est donc pas un problème de codec).

      « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

      • [^] # Re: Okular

        Posté par  . Évalué à 3.

        Étrange… Moi dans l'archive proposée, je lis le movie annotation (test-multimedia.pdf) et le screen annotation (test-movie15.pdf) et pas le rich media annotation (test-media9.pdf, mais ça ça me semble attendu). Du coup ça viendrait d'un packaging de KDE différent? Moi c'est celui de Kubuntu 12.10.

        • [^] # Re: Okular

          Posté par  . Évalué à 4.

          Je suis sur celui d'opensuse 12.3.

          « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

        • [^] # Re: Okular

          Posté par  . Évalué à 4.

          @chez moi ça marche comme toi. slackware 14.1 et okular 0.17.0

  • # bref

    Posté par  . Évalué à 7. Dernière modification le 13 novembre 2013 à 09:08.

    En conclusion, vu que c'est mal supporté, mal intégré, et pas fait pour ça*, c'est une très mauvais idée de vouloir intégrer des vidéos dans un fichier pdf. Je sais que certains veulent l'utiliser pour tous les usages (musique, visualisation 3D, pourquoi pas rajouter un tableur tant qu'on y est ??), mais à un moment il faut s'arrêter de rendre ce format incompatible avec tout ce qui n'est pas adobe.

    *rappel wikipedia :

    Le Portable Document Format, communément abrégé en PDF, est un langage de description de pages créé par la société Adobe Systems et dont la spécificité est de préserver la mise en forme d’un fichier – polices d'écritures, images, objets graphiques, etc – telle qu'elle a été définie par son auteur, et cela quels que soient le logiciel, le système d'exploitation et l'ordinateur utilisés pour l’imprimer ou le visualiser.

    « I approve of any development that makes it more difficult for governments and criminals to monopolize the use of force. » Eric Raymond

    • [^] # Re: bref

      Posté par  . Évalué à 7.

      mais à un moment il faut s'arrêter de rendre ce format incompatible avec tout ce qui n'est pas adobe.

      En l’occurence, et malgré tout le plaisir que j’ai à cracher sur Adobe, les deux premières méthodes d’intégration sont standards (et étaient déjà parfaitement documentées avant d’être normalisées), donc si ça marche mal avec autre chose que Adobe Reader, ce n’est pas à Adobe qu’il faut s’en prendre.

      Si j’ai une chose à reprocher à Adobe, c’est plutôt d’avoir ajouté une troisième méthode (à base de Flash qui plus est, argh), dont l’intérêt est plus que contestable.

      Pour les méthodes standards, la bibliothèque Poppler supporte sans problèmes les annotations concernées, il appartient ensuite aux développeurs des visionneurs d’en tirer profit. Certains le font, d’autres non.

      Je préfère utiliser un format standard qui existe maintenant qu’un hypothétique format spécialisé qui reste à inventer et qui sera standardisé (s’il l’est un jour) dans quinze ans.

    • [^] # Re: bref

      Posté par  . Évalué à 6.

      Comme HTML ?

    • [^] # Re: bref

      Posté par  . Évalué à 5.

      En conclusion, vu que c'est mal supporté, mal intégré, et pas fait pour ça

      Le mauvais support est plus la faute des lecteurs que de la norme qui décris bien le fonctionnement (dans le cas des 2 premières solutions).
      Le fait que ce n'est pas fait pour ça à la base ne veut pas dire grand chose. HTML n'est pas fait pour être dynamique, wikipedia n'est pas fait pour être une source de définition (ce sont les références que l'on trouve dans wikipedia qui devraient l'être), etc

      Il faut lutter par contre contre la troisième solution qui d'un point de vu éthique n'est pas normalisée, ni documentée et produit une incompatibilité importante et qui d'un point de vu technique est monstrueuse (intégrer une VM complète dans un langage de description de document).

      Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

  • # De pire en pire

    Posté par  . Évalué à 5.

    Du javascript et maintenant des vidéos, ce format devient de plus en plus poubelle. Après on s'étonne que Adobe pèse 180Mo et soit bourré de faille.

    On pourrait faire un parallèle avec les navigateur qui veulent devenir des environnements de développement pour applications lourdes.

    Si je zippe 2 fichiers odt et mp4 : j'obtiens la même chose, en moins merdique.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.