La méthode captureStream()
permet de capturer un MediaStream
à partir d'un élément <canvas>
, <audio>
ou <video>
.
Cela permet d'enregistrer, de diffuser en direct via WebRTC ou de combiner un flux vidéo ou audio de l'un de ces éléments avec des effets ou d'autres MediaStream
dans un <canvas>
. En d'autres termes, captureStream()
permet à MediaStream
de transmettre des contenus multimédias entre des éléments de canevas, audio ou vidéo, ou à un RTCPeerConnection
ou un MediaRecorder
.
Dans la démonstration suivante (disponible dans les exemples WebRTC), un MediaStream
capturé à partir d'un élément de canevas à gauche est diffusé via une connexion peer WebRTC à l'élément vidéo à droite:
(Vous trouverez des liens vers d'autres exemples de canevas et de vidéos ci-dessous.)
Le code captureStream()
est simple.
Pour <canvas>
:
var canvas = document.querySelector('canvas');
var video = document.querySelector('video');
// Optional frames per second argument.
var stream = canvas.captureStream(25);
// Set th<e sou>rce of the video element to be the <stream> from the canvas.
video.srcO
bject = stream;
Pour <video>
:
var leftVideo = document.getElementById('leftVideo');
var rightVideo = document.getElementById('rightVideo');
leftVideo.onplay = function() {
// Set th<e sou>rce of one video element to be a stream from another.
var stream = leftVideo.captureStream();
rightVideo.srcObje
ct = stream;
};
Mais pourquoi ?
La méthode captureStream()
permet d'enregistrer ou de diffuser en direct à partir de canevas et d'éléments multimédias:
- Enregistrer et diffuser des parties de jeu depuis un
<canvas>
- Filmer une vidéo avec une caméra, puis ajouter du contenu ou des effets
- Créer des effets Picture-in-picture à partir de plusieurs vidéos via un
<canvas>
- Combiner des vidéos et des images (à partir de fichiers ou d'une caméra, ou des deux) dans une
<canvas>
- Vidéo diffusée en direct à partir d'un fichier
- Utiliser un message audio ou vidéo enregistré pour un message vocal ou vidéo
Essentiellement, captureStream()
permet à JavaScript de créer et d'injecter des éléments dans un MediaStream.
Les petits caractères
Toute tentative d'utilisation de
captureStream()
avec un élément multimédia qui implémente la protection du contenu via les extensions multimédias chiffrées génère une exception.Lors de la capture à partir d'un
<canvas>
, la fréquence d'images maximale est définie lorsquecaptureStream()
est appelé. Par exemple,canvas.captureStream(10)
signifie que le canevas génère entre 0 et 10 FPS. Rien n'est capturé lorsque rien n'est peint sur le<canvas>
, et 10 FPS sont capturés même si le<canvas>
est peint à 30 FPS. Un bug avec plus de discussion a été enregistré dans la spécificationcaptureStream
.Les dimensions d'une vidéo
captureStream()
correspondent à celles de l'<canvas>
sur laquelle elle a été appelée.
Démonstrations
Canevas
- Diffuser un flux à partir d'un élément de canevas vers un élément vidéo
- Diffuser du contenu à partir d'un élément de canevas vers une connexion point à point
Vidéo
- Diffuser un flux d'un élément vidéo vers un autre
- Diffuser un flux à partir d'un élément vidéo vers une connexion peer-to-peer
Assistance
- Dessin
captureStream()
: Firefox 43 ou version ultérieure ; Chrome 50 ou version ultérieure avec chrome://flags/#enable-experimental-web-platform-features activé, ou Chrome 52 ou version ultérieure par défaut. - Vidéo et audio
captureStream()
: Firefox 47 ; Chrome 52 et versions ultérieures avec chrome://flags/#enable-experimental-web-platform-features activé, ou Chrome 53 et versions ultérieures par défaut.