gpt4 book ai didi

canvas - 是否可以将流作为源添加到 html Canvas 元素作为 html 视频元素?

转载 作者:行者123 更新时间:2023-12-03 20:28:20 24 4
gpt4 key购买 nike

根据 MDN:

The HTMLMediaElement interface adds to HTMLElement the properties and methods needed to support basic media-related capabilities that are common to audio and video.



HTMLMediaElement.captureStream() .它可以与 <video> 一起使用和 <canvas>元素来捕获它们的流。

相反,可以添加 视频流srcObject<video>元素,然后它显示它。 <canvas> 有可能吗?元素也是?

有没有可能 添加流 作为 来源 到 html <canvas>元素?

最佳答案

没有任何 Canvas API 能够使用 MediaStream。
Canvas API 仅适用于原始像素,不包含任何类型的解码器。您必须使用能够进行此解码的 javascript 对象(例如 ImageBitmap)或 HTMLElements。
因此,对于 MediaStream,目前唯一能够解码其视频内容的对象将是 HTMLVideoElement,您将能够 draw on your canvas easily .

2021 年更新
WebCodecs API最近取得了很大的进展,并且变得越来越成熟,现在值得一提的是它作为一种解决方案。
此 API 提供了一个名为 VideoFrame 的新接口(interface)这将soon成为 CanvasImageSources 的一部分类型,含义,我们可以直接用drawImage , texImage2D在任何地方都可以使用这样的 CanvasImageSource。
MediaCapture Transform W3C小组开发了MediaStreamTrackProcessor确实从视频 MediaStreamTrack 返回此类 VideoFrames。
所以我们现在有一种更直接的方法来将 MediaStream 渲染到 Canvas 上,目前它只适用于带有 #enable-experimental-web-platform-features 的 Chrome 浏览器。旗上...

if( window.MediaStreamTrackProcessor ) {
const canvas = document.querySelector("canvas");
const ctx = canvas.getContext("2d");
const track = getCanvasTrack(); // MediaStream.getVideoTracks()[0]
const processor = new MediaStreamTrackProcessor( track );
const reader = processor.readable.getReader();
readChunk();
function readChunk() {
reader.read().then( ({ done, value }) => {
// the MediaStream video can have dynamic size
if( canvas.width !== value.displayWidth || canvas.height !== value.displayHeight ) {
canvas.width = value.displayWidth;
canvas.height = value.displayHeight;
}
ctx.clearRect( 0, 0, canvas.width, canvas.height );
// value is a VideoFrame
ctx.drawImage( value, 0, 0 );
value.close(); // close the VideoFrame when we're done with it
if( !done ) {
readChunk();
}
});
}
}
else {
console.error("Your browser doesn't support this API yet");
}

// We can't use getUserMedia in StackSnippets
// So here we use a simple canvas as source
// for our MediaStream.
function getCanvasTrack() {
// just some noise...
const canvas = document.createElement("canvas");
const ctx = canvas.getContext("2d");
const img = new ImageData(300, 150);
const data = new Uint32Array(img.data.buffer);
const track = canvas.captureStream().getVideoTracks()[0];

anim();

return track;

function anim() {
for( let i=0; i<data.length;i++ ) {
data[i] = Math.random() * 0xFFFFFF + 0xFF000000;
}
ctx.putImageData(img, 0, 0);
if( track.readyState === "live" ) {
requestAnimationFrame(anim);
}
}

}
<canvas></canvas>

作为 glitch project ( source ) 使用相机作为源。

关于canvas - 是否可以将流作为源添加到 html Canvas 元素作为 html 视频元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56093061/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com