La balise video de HTML permet de lire directement une vidéo dans le navigateur. Une autre possibilité que propose HTML5 est de lire une vidéo dans un <canvas>. Cela peut avoir plusieurs avantages : modification de l’affichage (taille, découpe, etc…), ajout d’informations en surimpression de la vidéo, de filtres de couleurs, lecture de plusieurs vidéo dans une seule balise <canvas>, etc…
C’est ce que nous allons voir dans ce tutoriel. La première étape va être de définir le code HTML et CSS de base :
<!DOCTYPE html> <html> <head> <style> body { height: 100%; width: 100%; } #color { width: 80px; } #opacity { width: 30px; } </style> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> </head> <body> <canvas width="600" height="320" id="video"> Votre navigateur ne supporte pas la balise canvas </canvas> <div id="bar"> <input type="checkbox" id="filter" /> Filtre : <input type="text" value="255, 0, 0" id="color_filter" /> (opacity : <input type="text" value="0.3" id="opacity_filter" />)<br /> <input type="checkbox" id="bruit" /> Bruit : <input type="text" value="0, 0, 0" id="color_bruit" /> (opacity : <input type="text" value="0.7" id="opacity_bruit" />) </div> </body> </html>
On a donc uniquement une balise canvas qui va servir à lire notre vidéo puis un div où on va définir 2 options de surimpression pour la vidéo : un filtre de couleur et du bruit.
Maintenant nous allons instancier un élément <video> et la lire :
var video = document.createElement('video'); video.width = 600; video.height = 320; $(video).html('<source src="../video_HTML5/video.webm" type="video/webm" /><source src="../video_HTML5/video.mp4" type="video/mp4" />'); video.volume = 0; video.play();
On définit donc la vidéo avec sa taille et 2 sources pour être compatible avec la plupart des navigateurs (webm et mp4). Ensuite on rend la vidéo muette en mettant le volume a 0 et on lance la lecture. A ce stade notre vidéo n’est pas affiché puisque notre élément video n’est pas intégré à la page. Ce que nous voulons c’est que la lecture s’affiche dans le canvas donc :
var ctx = $('#video')[0].getContext('2d'); setInterval(video_to_canvas, 30); function video_to_canvas() { ctx.drawImage(video, 0, 0, video.width, video.height); }
On récupère le context du canvas pour dessiner dedans et on défini un appel à la fonction video_to_canvas toutes les 30 millisecondes.
Cette fonction va dessiner l’image courante de la vidéo dans la canvas.
Ajoutons maintenant les 2 fonctionnalités donc nous avons parlé tout à l’heure : un filtre de couleur et du bruit . Nous avons défini ce code HTML tout à l’heure :
<div id="bar"> <input type="checkbox" id="filter" /> Filter : <input type="text" value="255, 0, 0" id="color_filter" /> (opacity : <input type="text" value="0.3" id="opacity_filter" />)<br /> <input type="checkbox" id="bruit" /> Bruit : <input type="text" value="0, 0, 0" id="color_bruit" /> (opacity : <input type="text" value="0.7" id="opacity_bruit" />) </div>
Nous avons pour chacune des fonctionnalités 3 champs : 1 case à cocher (fonction activée ou non), 2 champs texte (couleur et opacité). Modifions donc maintenant la fonction video_to_canvas de tout à l’heure pour prendre en compte ces champs et leurs valeurs :
function video_to_canvas() { ctx.drawImage(video, 0, 0, video.width, video.height); if($('#filter:checked').length > 0) { ctx.fillStyle = 'rgba('+$('#color_filter').val()+', '+$('#opacity_filter').val()+')'; ctx.fillRect(0,0,video.width,video.height); } if($('#bruit:checked').length > 0) { for(var i=0; i<300; i++) { ctx.fillStyle = 'rgba('+$('#color_bruit').val()+', '+$('#opacity_bruit').val()+')'; ctx.fillRect(Math.random()*video.width,Math.random()*video.height,1,2); } } }
- On dessine un rectangle de la couleur et de l’opacité choisis sur toutes la taille du canvas si le filtre est activé
- On ajoute 300 « petits points de bruit » de la couleur et de l’opacité choisis à des emplacement aléatoire dans le canvas
Voila c’est terminé pour ce tuto ! A vous maintenant d’imaginer d’autres fonctionnalités avec les possibilités offertes par HTML5…
Démonstration video et canvas HTML5 – Télécharger le ZIP du tutoriel