El método captureStream()
permite capturar un MediaStream
de un elemento <canvas>
, <audio>
o <video>
.
Esto permite que se grabe una transmisión de audio o video de cualquiera de estos elementos, se transmita en vivo a través de WebRTC o se combine con efectos o con otros MediaStream
en un <canvas>
. En otras palabras, captureStream()
permite que MediaStream
pase contenido multimedia entre elementos de lienzo, audio o video, o a un RTCPeerConnection
o MediaRecorder
.
En la siguiente demostración (disponible en los muestras de WebRTC), un MediaStream
capturado de un elemento de lienzo a la izquierda se transmite a través de una conexión de pares de WebRTC al elemento de video a la derecha:
(Más abajo, encontrarás vínculos a más ejemplos de lienzos y videos).
El código captureStream()
es simple.
Para <canvas>
:
var canvas = document.querySelector('canvas');
var video = document.querySelector('video');
// Optional frames per second argument.
var stream = canvas.captureStream(25);
// Set the source of the <video> element to be the stream from the <canvas>.
video.srcObject = stream;
Para <video>
:
var leftVideo = document.getElementById('leftVideo');
var rightVideo = document.getElementById('rightVideo');
leftVideo.onplay = function() {
// Set the source of one <video> element to be a stream from another.
var stream = leftVideo.captureStream();
rightVideo.srcObject = stream;
};
Pero ¿por qué?
El método captureStream()
permite grabar o transmitir en vivo desde el lienzo y los elementos multimedia:
- Graba y transmite partidas de juegos desde un
<canvas>
- Captura un video desde una cámara y, luego, agrega contenido o efectos adicionales
- Crea efectos de pantalla en pantalla a partir de varios videos con un
<canvas>
- Combina imágenes y videos (de archivos, una cámara o ambos) en un
<canvas>
- Transmisión en vivo de videos reproducidos desde un archivo
- Usa un mensaje de audio o video grabado para un video o un buzón de voz
En esencia, captureStream()
permite que JavaScript construya y “inyecte contenido” en una MediaStream.
La letra pequeña
Si intentas usar
captureStream()
con un elemento multimedia que implementa la protección de contenido a través de las Extensiones de medios encriptados, se arrojará una excepción.Cuando se captura desde un
<canvas>
, la velocidad de fotogramas máxima se establece cuando se llama acaptureStream()
. Por ejemplo,canvas.captureStream(10)
significa que el lienzo genera entre 0 y 10 fps. No se captura nada cuando no se pinta nada en<canvas>
, y se capturan 10 fps, incluso si<canvas>
se pinta a 30 fps. Hay un error con más información registrado en la especificación decaptureStream
.Las dimensiones de un video
captureStream()
coinciden con las de<canvas>
en las que se llamó.
Demostraciones
Lienzo
- Cómo transmitir desde un elemento de lienzo a un elemento de video
- Transmite desde un elemento de lienzo a una conexión entre pares
Video
- Cómo transmitir de un elemento de video a otro
- Cómo transmitir desde un elemento de video a una conexión entre pares
Asistencia
- Canvas
captureStream()
: Firefox 43 o versiones posteriores; Chrome 50 y versiones posteriores con la opción chrome://flags/#enable-experimental-web-platform-features habilitada, o Chrome 52 y versiones posteriores de forma predeterminada - Video y audio
captureStream()
: Firefox 47; Chrome 52 y versiones posteriores con la función chrome://flags/#enable-experimental-web-platform-features habilitada, o Chrome 53 y versiones posteriores de forma predeterminada.