javascript - 如何将嵌入式 YouTube 视频的帧(通过 iframe)写入 Canvas ?

标签 javascript html5-canvas youtube-javascript-api

我希望能够从 YouTube 视频中的不同点(不仅仅是缩略图)提取帧,并对它们进行一些处理。我可以使用 iframe API 将视频嵌入我的网站,但我正在努力寻找一种方法将其捕获到 Canvas 上。 (如果我被迫捕获整个屏幕没关系,如果我必须更改浏览器设置以允许它也没关系。)

最佳答案

一种选择是编写浏览器扩展。但我猜你会想避免这种情况。

另一种选择是使用 Screen Capture API(Chrome、Edge 和 Firefox 支持)。查看browser compatibility information在 MDN 上。

使用此 API,您可以允许您的用户共享他的屏幕或浏览器选项卡并在 transient 视频元素上播放:

const videoElem = document.createElement('video');
videoElem.autoplay = true;

const displayMediaOptions = {
  video: {
    cursor: "never"
  },
  audio: false
};

async function startCapture() {
  videoElem.srcObject = await navigator.mediaDevices
    .getDisplayMedia(displayMediaOptions);
}

稍后您可以在 Canvas 上绘制视频以获得 Base64 帧(基本上是屏幕截图)。

function getScreenshotInBase64() {
  let canvas = document.createElement('canvas');
  let context = canvas.getContext('2d');
  let [w, h] = [videoElem.videoWidth, videoElem.videoHeight];
  canvas.width =  w;
  canvas.height = h;
  context.drawImage(videoElem, 0, 0, w, h);
  return canvas.toDataURL();
}

这种方法的局限性:

  • 用户可以选择不同的选项卡/应用程序/屏幕,或者页面可能会向下滚动且视频不可见。
  • 您得到的不仅仅是视频(但根据您的描述,这不一定是坏事)。
  • 几乎没有浏览器支持(如果您考虑旧版浏览器或移动浏览器)。
  • 用户必须允许您这样做(基本上每次您想要开始分享 = 录制您案例中的视频)。

我用上面的代码片段构建了一个小的 JsFiddle,它在你开始屏幕共享(通过单击开始按钮)2 秒后得到一个 Base64 打印屏幕:https://jsfiddle.net/75Lmbf2o/ .

关于javascript - 如何将嵌入式 YouTube 视频的帧(通过 iframe)写入 Canvas ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54728264/

相关文章:

javascript - YouTube API - 在设定的开始和结束时间之间循环播放视频

javascript YoutubePlayer OnStateChange 未触发

javascript - 打印 HTML 时,如何确定页面结束前剩余多少空间?

javascript - Javascript 中的贪吃蛇游戏

javascript - 在 Firefox 上缩放 Canvas 不会影响 SVG 图像

javascript - 单击按钮几次使游戏运行得越来越快 - javascript

jquery - 出现错误,YouTube图片无法触发

javascript - d3js 图形代码以不同的顺序显示不同数据的 y 轴

javascript - 在文本区域内显示数据(ejs)

javascript - HTML-Canvas - JavaScript-动画/绘图