La balise video dans Firefox
Par Laurentj le mercredi, juillet 9 2008, 11:38 - Technologies Web - Lien permanent
Il y a quelques heures, l'implémentation de la balise <video> a été intégré dans la version de développement de Firefox 3.1 !! Mais ce n'est pas encore totalement fonctionnel : il manque encore l'intégration des "backend", c'est à dire des parties de code qui lisent et affichent la vidéo. En clair : on peut mettre une balise <video>, ses attributs fonctionnent, son API (play(), stop()...) fonctionne, il y a un carré sur la page web où est censée s'afficher la vidéo, mais il ne se passe rien. Cependant ça va venir.
Pour éviter les problèmes de brevets avec les codecs et autres, les développeurs ont décidé non pas d'intégrer directement les codecs dans Firefox, mais tout simplement de faire appel au système d'exploitation. Ainsi, Firefox fera appel à DirectShow sous windows, à Gstreamer sous linux, et à Quicktime sous mac. Cela aussi évite d'embarquer X codecs dans le navigateur. Point négatif : si on veut diffuser une vidéo dans un format propriétaire, on pourra, mais bien sûr, tout le monde ne pourra pas le lire. C'est pourquoi il est quand même recommandé de publier les vidéos en OGG/Theora. Enfin bref, ce qui manque encore dans l'implémentation actuelle dans Firefox, c'est ce "petit" lien entre <video> et Gstreamer/DirectShow/QuickTime[1].
Des patchs sont cependant presque prêt, et pour les impatients, vous pouvez toujours aller chercher des versions expérimentales de Firefox implémentant complètement <video> sur le site de Chris Double.
Et pour les impatients mais qui n'ont vraiment pas le temps de faire mumuse, voici quelques captures d'écran :-)
L'un des intérêts de la balise <video>, c'est que, si vous le souhaitez, le navigateur peut fournir les boutons de base pour manipuler la vidéo. Suffit d'indiquer l'attribut controls :
<video id='v1' src="ascannerdarkly480.ogg" controls="true"></video>
Quand vous survolez la vidéo avec la souris, ça donne ça dans Firefox quand elle est en pause :

Et ça quand elle est en lecture :

Pour l'instant, l'interface par défaut n'est pas très "sexy" et complète, mais ça viendra je pense.
Si on ne veut pas de ces contrôles par défaut, on ne met pas cet attribut controls, et on ajoute des boutons HTML qui appelleront les fonctions javascript de la balise <video> :
<button onclick="document.getElementById('v1').play()">Play</button>
<button onclick="document.getElementById('v1').pause()">Pause</button>
<button onclick="document.getElementById('v1').volume += 0.25">Volume Up</button>
<button onclick="document.getElementById('v1').volume -= 0.25">Volume Down</button>
<button onclick="document.getElementById('v1').muted = true;">Mute</button>
<button onclick="document.getElementById('v1').muted = false">Unmute</button>
<div>
<video id="v1" src="smeck.ogg"
onbegin="" onprogress="" onloadedmetadata="" onemptied="" onstalled=""
onplay="" onpause="" onwaiting="" ontimeupdated="" onended=""
ondataunavailable="" oncanplay="" oncanplaythrough=""
onratechange="" ondurationchange="" onvolumechange=""
oncanshowcurrentframe="" onloadedfirstframe=""/>
</div>
Notez les méthodes et propriétés play(), pause(), volume etc.. Vous remarquerez aussi les attributs on* : cela vous montre la plupart des événements auxquels vous pouvez réagir dans votre page web (qu'il y ait controls="true" ou pas).
L'exemple donne ça :

Ici l'exemple n'est pas très joli non plus. Il y a une autre démo sur le site d'Opéra qui montre des boutons dans une div superposée qui apparait en "glissant" au passage de la souris, comme dans certains lecteurs flash, habillée avec de la transparence en CSS, montrant que l'on peut donc tout à fait jouer avec la balise <video> comme n'importe quel autre balise HTML :

À propos de jouer, il y a une autre démo, qui montre deux videos intégrées dans du SVG, avec "des poignées" pour les tourner et les agrandir, comme dans une des démos que j'avais signalé en février, sauf qu'au lieu d'images fixes, ce sont des vidéos :

Bref, tout ces exemples montrent bien la supériorité de la balise <video> sur l'utilisation d'un plugin flash : on peut mieux contrôler son affichage et son fonctionnement, donc mieux l'intégrer dans des pages web. Et en beaucoup moins lourd.
Pour les binaires de ce Firefox expérimental et les démos (dont je vous invite à regarder le code source), c'est par ici donc.
PS: lire aussi un précédent billet expliquant les avantages de la balise <video>.
Notes
[1] Mise à jour 06/08/2008 : finalement, et cela a été annoncé au Firefox plus Summit 2008 le 31 juillet dernier, Firefox 3.1 saura lire les videos ogg/theora nativement, quelque soit le système d'exploitation
Commentaires
great ! Est-ce qu'il commence déja a se développer des techniques fournissant des alternatives pour les "vieux navigateurs tout pourris qui méritent la mort" (tous les navigateurs actuels finalement ; )
À l'intérieur de la balise, tu peux mettre du html, qui sera affiché dans les navigateurs qui ne comprennent pas cette balise :
Au pire, tu peux y mettre une balise object avec du flash (j'ai pas essayé) pour les "vieux" navigateurs.
Pour rappel, cette balise video fait parti de HTML5, actuellement en cours de standardisation au W3C.
C'est une vraie révolution qui se prépare là. Vivement, très vivement que ça arrive !
Et si on veut un truc pas propriétaire mais moins moche que du ogg/theora (et accessoirement un peu plus institutionnel), ça marche bien avec du MPEG4 ?
@av1 : tout dependra du support de ton format préféré dans Gstreamer, DirectShow ou sur mac.. Bref, Firefox n'a rien à voir là dedans. Maintenant, je ne vois pas ce que tu lui trouve de moche à Theora :-) Au moins, c'est pas bardé de brevet dans tout les sens comme mpeg4. Et avec (peut-être, c'est pas sûr), un support natif dans Firefox (en tout cas, on pourra se compiler un Firefox avec support natif), ça pourrait bien faire décoller Theora, donc contribuer à son amélioration, si tant est-il qu'il est besoin d'amélioration.
@Irabe : bon, je confirme, pour les "dégradations" en douceur dans les "vieux" navigateurs, il suffit de mettre une balise object à l'interieur de la balise video, et ça fonctionne. Voici un exemple sur un nouveau billet de Chris Double, qui montre une vidéo avec en plus les effets que j'évoquais dans ce billet précédent, avec une reflexion de la video sur la page web (fait avec canvas)
Quid du support du plein écran ? C'est possible ? fonction du codec et ou du système ? Parce que rien dans tes explications n'y fait mention ...
Les écrans deviennent de plus en plus grand et les vidéos de plus en plus longue et ne pas avoir cette fonction disponible me semble assez rédhibitoire spécialement si il est question de faire concurrence aux lecteurs flash ...
Question subsidiaire : y a t'il un support du "streaming". Je sais que ça dépend déjà du codec employé mais si le codec le supporte, peut on gérer le buffering de la vidéo et ne pas attendre son chargement complet. Idem pour la possibilité demander à lancer une section de la vidéo (par exemple la fin) alors qu'elle n'est pas encore chargée (voir dailymotion pour les exemples). Là encore flash permet tout ça. Je ne suis pas pour ce type de lecteurs mais tant qu'ils offriront des fonctions en plus il seront dur à détrôner ...
pour le plein écran, je n'en sais rien. Pour le streaming, la bufferisation, le demarrage de la lecture à un endroit donné, etc, tout ça c'est prévu dans les specs, et je pense que c'est plus ou moins implémenté dans la version expérimentale de Firefox.
Les jours sont comptés pour l'utilisation de Flash :-p (en tout cas en dehors de youtube et cie).
Pour le plein écran, la dernière fois que j'ai lu la spec, c'était écrit en gros rouge "impossible", pour des questions de phishing, simulation d'interface. Par contre, le user agent peut fournir cette possibilité, mais surtout pas accessible en script.
"concurrence à flash" .. Je pense que c'est plus de la normalisation et du détachement d'obligation d'utiliser des outils "propriétaires" presque imposés.
"avoir le choix" c'est la liberté.
Pour que cela ait un sens, il faut que les autres navigateurs l'implémentent aussi. Est-ce prévu ou en cours pour les navigateurs webkit, opéra et MS ?
Merci pour cette excellente nouvelle Laurent. J'allais demander où en était la balise <audio> mais apparemment elle est incluse dans le même patch : http://www.bluishcoder.co.nz/2008/07/video-and-audio-element-patch-has.html :-)
@christophe : oui c'est en cours dans webkit et opera. Dans opera ça fonctionne depuis quelques mois déjà (si tu avais suivi le lien que j'ai donné, tu l'aurais su :-p )
@clochix : oui, je confirme.
C'est plus qu'en cours pour WebKit puisque c'est déjà dans Safari 3.1. Par contre, ce n'est pas la spécification complète. Cf le très intéressant blog de WebKit
Je ne vois toujours aucun avantage de l'élément vidéo par rapport à l'élément object.
@nicolas : sémantique, api standardisé, controles par défaut si on le souhaite, accessibilité, facilité de développement etc..
bref, si pour toi ces avantages n'en sont pas par rapport à une balise object qui ne veut rien dire, bah... M'enfin, je vais pas rentrer à nouveau dans le débat, on en a suffisement discuté dans mon billet précédent sur le sujet.
« bah... (...) je vais pas (...) »
Si on ne peut plus se faire expliquer les standards du web, où va-t-on ?
@Nicolas : j'ai déjà tout expliqué dans un autre billet, dont le lien est donné dans le billet actuel. Suffit de cliquer dessus. D'ailleurs, dans ce précédent billet, on en a largement discuté tout les deux. Je ne vois pas ce que je peux dire de plus. Si t'es pas d'accord et que tu ne vois toujours pas l'interêt de la balise video, je ne saurais pas t'expliquer autrement. Tu sembles avoir un avis tranché et définitif sur ce sujet (et c'est ton droit), que veux tu alors que je te dise de plus ?