使用img过滤器覆盖录制视频流

时间:2018-07-04 18:36:40

标签: javascript html html5-canvas media recorder

我正在使用面部跟踪库(tracking.js)来捕获视频流并将图像放置在面部上方。

图像绘制在画布上,该画布的宽度和高度与视频(即叠加层)相同。

我正在尝试拍摄流+画布图像的图片和视频,但是O只能得到失真的流和图像的粗略实现。

Here is a CodePen

const canvas = document.getElementById('canvas');
const context = canvas.getContext('2d');
const tracker = new tracking.ObjectTracker('face');
const flowerCrownButton = document.getElementById('flower-crown');

tracker.setInitialScale(1);
tracker.setStepSize(2.7);
tracker.setEdgesDensity(.2);

const img = document.createElement("img");
img.setAttribute("id", "pic");
img.src = canvas.toDataURL();

let filterX = 0;
let filterY = 0;
let filterWidth = 0;
let filterHeight = 0;

function changePic(x, y, width, height, src) {
  img.src = src;
  filterX = x;
  filterY = y;
  filterWidth = width;
  filterHeight = height;
}

function flowerCrown() {
  changePic(0, -0.5, 1, 1, 'https://s3-us-west- 
    2. amazonaws.com / s.cdpn.io / 450347 / flower - crown.png ')
  }

  flowerCrownButton.addEventListener('click', flowerCrown);

  //listen for track events
  tracker.on('track', function(event) {
    //if (event.data.length === 0) {
    //alert("No objects were detected in this frame.");
    //} else {
    context.clearRect(0, 0, canvas.width, canvas.height)
    event.data.forEach(rect => {
      context.drawImage(img, rect.x + (filterX * rect.width),
        rect.y + (filterY * rect.height),
        rect.width * filterWidth,
        rect.height * filterHeight
      )
    })
    //}// end of else
  });

  //start tracking
  tracking.track('#video', tracker, {
    camera: true
  })

  const canvas2 = document.getElementById('canvas2');
  const context2 = canvas2.getContext('2d');
  const video = document.getElementById("video");

  video.addEventListener("loadedmetadata", function() {
    ratio = video.videoWidth / video.videoHeight;
    w = video.videoWidth - 100;
    h = parseInt(w / ratio, 10);
    canvas2.width = w;
    canvas2.height = h;
  }, false);

  function snap() {
    context2.drawImage(video, 10, 5);
    context2.drawImage(img, 10, 10)
  }
}

有什么想法吗?我更喜欢使用媒体记录器API并进行了尝试,但是再次无法获得带有图像滤镜覆盖层的流或图片。

谢谢,请不要太狡猾:)

0 个答案:

没有答案