Как повторно создать URL через createObjectURL

107
16 апреля 2022, 17:20

Есть данный код:

function getVideoFromServer() {
    socket.on('video', video => {
        let blob = new Blob([video.video], {
            type: 'video/webm; codecs=\"vp8, opus\"'
        });
        let url = URL.createObjectURL(blob);
        videoTag.src = url;
    });
}

Первый раз URL создаётся и декодируется нормально, но второй раз выдаёт предупреждение: "Не удаётся декодировать медиаресурс"

Answer 1

Потому что при создании URL.createObjectURL выделяется сегмент памяти для созданного объекта, эту память для каждого такого объекта нужно высвобождать, делается это при помощи URL.revokeObjectURL.

Я бы сделал такую фабрику:

const createVideoFromServerGetter = () => {
  let url;
  return () => {
    if (url) {
      window.URL.revokeObjectURL(url);
    }
    socket.on('video', video => {
      let blob = new Blob([video.video], {
        type: 'video/webm; codecs=\"vp8, opus\"'
      });
      url = window.URL.createObjectURL(blob);
      videoTag.src = url;
    });
  };
};
const getVideoFromServer = createVideoFromServerGetter();
READ ALSO
Какой лучший способ глубокого копирования по производительности?

Какой лучший способ глубокого копирования по производительности?

Существуют много способов глубокого копирования, подскажите, что на данный момент является наиболее производительным при копировании объектов...

216
Как сделать цикл по времени в JS, чтобы выводились каждые 15 минут между двумя числами времени?

Как сделать цикл по времени в JS, чтобы выводились каждые 15 минут между двумя числами времени?

Столкнулся с проблемой циклаНе могу понять как написать его правильно

243
Как анимировать маршрут (path) на SVG карте?

Как анимировать маршрут (path) на SVG карте?

Есть SVG карта созданная на RaphaelКак можно анимировать маршрут между двумя кликами на карте, как например здесь

193