Можно ли захватить элемент с данными перекрестного происхождения? - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть этот простой скрипт, который я нашел в webRTC doc i triet для его запуска, но, похоже, я что-то упустил

const leftVideo = document.getElementById('leftVideo');
const rightVideo = document.getElementById('rightVideo');

leftVideo.addEventListener('canplay', () => {
const stream = leftVideo.captureStream();
rightVideo.srcObject = stream;
});

я получаю эту ошибку при захвате потока при проверке Uncaught DOMException: не удалось выполнить captureStream для HTMLMediaElement: невозможно выполнить захват из элемента с данными из разных источников в HTMLVideoElement.leftVideo.addEventListener это мой index.html

<video id="leftVideo" playsinline controls loop muted>
    <source src="test1.webm" type="video/webm"/>
    <p>This browser does not support the video element.</p>
</video>

<video id="rightVideo" playsinline autoplay></video>

1 Ответ

0 голосов
/ 18 июля 2019
  1. Либо вы можете установить crossOrigin, как показано в этой ссылке Пример:

<video crossOrigin="anonymous" src="https://cdn.myapp.com:81/video.mp4"></video>

вы хотите убедиться, что ссылка использует https

Ссылка: https://stackoverflow.com/a/35245146/8689969

  1. или вы можете создать читаемый поток, используя fetch, следите за документацией по этой ссылке: https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream, которая дает вам URL-адрес блоба, который должен помочь в решении этой проблемы: Пример:

// Fetch the original image
    fetch(video.filePath,  {
      mode: 'cors',
      headers: {
        'Access-Control-Allow-Origin':'*'
      }
    })
    // Retrieve its body as ReadableStream
    .then(response => {
      const reader = response.body.getReader();

      return new ReadableStream({
        start(controller) {
          return pump();
          function pump() {
            return reader.read().then(({ done, value }) => {
              // When no more data needs to be consumed, close the stream
              if (done) {
                  controller.close();
                  return;
              }
              // Enqueue the next data chunk into our target stream
              controller.enqueue(value);
              return pump();
            });
          }
        }  
      })
    })
    .then(stream => new Response(stream))
    .then(response => response.blob())
    .then(blob => URL.createObjectURL(blob))
    .then((url) => {
      // gives the blob url which solves cors error in reading stream(using captureStream() func)

      console.log(url);

      // do your thing
    })
    .catch(err => console.error(err));
  • Удачи ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...