--- title: Manipulation Audio et Vidéo slug: Web/Guide/Audio_and_video_manipulation tags: - Audio - Canvas - HTML5 - Video - Web Audio API - WebGL translation_of: Web/Guide/Audio_and_video_manipulation --- La beauté du web est qu'on peut combiner différentes technologies pour en créer de nouvelles. Avoir de l'audio et vidéo nativement dans le navigateur nous donne la possibilité d'utiliser ces flux de données avec d'autres technologies comme {{htmlelement("canvas")}}, [WebGL](/fr/docs/Web/API/WebGL_API) ou [Web Audio API](/fr/docs/Web/API/Web_Audio_API) pour modifier le média — par exemple ajouter des effets de réverbération ou de compression à l'audio, ou encore des filtres noir & blanc/sépia aux vidéos. Cet article fournit une référence pour expliquer ce que vous pouvez faire. ## Manipulation Vidéo La possibilité de lire les valeurs de pixels de chaque image d'une vidéo peut être très utile, cela nous permet de placer ces images dans d'autres contextes. ### Vidéo et Canvas {{htmlelement("canvas")}} est un moyen de dessiner de manière scripté sur des pages web; c'est un outil très puissant et qui peut être couplé avec du contenu vidéo. La technique générale est comme suit: 1. Dessiner une image de l'élément {{htmlelement("video")}} sur un élément {{htmlelement("canvas")}} intermédiaire. 2. Lire les données de l'élément `` et les manipuler. 3. Écrire les données manipulées dans le `` que l'on veut afficher. 4. Marquer une pause et répéter. On peut configurer notre lecteur vidéo et l'élément `` comme ceci: ```html ``` Et les manipuler comme ceci: (en l'occurence, on affiche une version en noir et blanc de la vidéo) ```js var processor = { timerCallback: function() { if (this.video.paused || this.video.ended) { return; } this.computeFrame(); var self = this; setTimeout(function () { self.timerCallback(); }, 16); // roughly 60 frames per second }, doLoad: function() { this.video = document.getElementById("my-video"); this.c1 = document.getElementById("my-canvas"); this.ctx1 = this.c1.getContext("2d"); var self = this; this.video.addEventListener("play", function() { self.width = self.video.width; self.height = self.video.height; self.timerCallback(); }, false); }, computeFrame: function() { this.ctx1.drawImage(this.video, 0, 0, this.width, this.height); var frame = this.ctx1.getImageData(0, 0, this.width, this.height); var l = frame.data.length / 4; for (var i = 0; i < l; i++) { var grey = (frame.data[i * 4 + 0] + frame.data[i * 4 + 1] + frame.data[i * 4 + 2]) / 3; frame.data[i * 4 + 0] = grey; frame.data[i * 4 + 1] = grey; frame.data[i * 4 + 2] = grey; } this.ctx1.putImageData(frame, 0, 0); return; } }; ``` Une fois que la page est chargée, on peut appeler ```js processor.doLoad() ``` {{EmbedLiveSample("Vidéo_et_Canvas", '100%', 550)}} > **Note :** En raison de problèmes de sécurité potentiels, si votre vidéo se trouve sur un domaine différent de votre page, vous devez activer [CORS (Cross Origin Resource Sharing)](/fr/docs/Web/HTTP/CORS) sur le serveur qui héberge la vidéo et utiliser l'attribut `crossorigin` sur la balise vidéo. > **Note :** L'exemple présenté est un exemple minimal de manipulation vidéo avec canvas; pour plus d'efficacité, vous pouvez envisager d'utiliser requestAnimationFrame à la place de setTimeout pour les navigateurs qui le prennent en charge. ### Vidéo e WebGL [WebGL](/en-US/docs/Web/WebGL) est une API puissante qui utilise canvas pour (typiquement) afficher des scènes en trois dimensions. On peut combiner WebGL et l'élément {{htmlelement("video")}} pour créer des textures vidéo, ce qui veut dire que vous pouvez placer une vidéo dans des scènes 3D. Exemple: {{EmbedGHLiveSample('webgl-examples/tutorial/sample8/index.html', 670, 510) }} > **Note :** Vous pouvez trouver le [code source de cette démo sur GitHub](https://github.com/mdn/webgl-examples/tree/gh-pages/tutorial/sample8) ([la voir en direct](https://mdn.github.io/webgl-examples/tutorial/sample8/) aussi). ### Vitesse de lecture On peut ajuster la vitesse de lecture de l'audio et vidéo en utilisant l'attribut `playbackRate` (voir {{domxref("HTMLMediaElement")}}). Il prend pour valeur un nombre qui est le coefficient à appliquer à la vitesse de lecture: par exemple, 0.5 représente la moitié de la vitesse tandis que 2 représente le double. HTML: ```html ``` JavaScript: ```js var myVideo = document.getElementById('my-video'); myVideo.playbackRate = 2; ``` #### Code jouable ```html hidden
   
``` ```js hidden var textarea = document.getElementById('code'); var reset = document.getElementById('reset'); var edit = document.getElementById('edit'); var code = textarea.value; function setPlaybackRate() { eval(textarea.value); } reset.addEventListener('click', function() { textarea.value = code; setPlaybackRate(); }); edit.addEventListener('click', function() { textarea.focus(); }) textarea.addEventListener('input', setPlaybackRate); window.addEventListener('load', setPlaybackRate); ``` {{ EmbedLiveSample('Code jouable', 700, 425) }} > **Note :** Essayez l' [exemple playbackRate](http://jsbin.com/qomuvefu/2/edit) en direct. > **Note :** `playbackRate` marche avec les éléments `