Если URL-адреса BLOB-объектов неизменны, то как API-интерфейс Media Source Extension использует их для потоковой передачи видео? - PullRequest
0 голосов
/ 10 февраля 2019

Давайте начнем с примера:

  1. Вы посещаете youtube.com, который использует Media Source Extension (MSE) с HTML5 для определенных устройств.
  2. MSE внедряет тег с BLOB-URL.Это выглядит примерно так: blob: https://www.youtube.com/blahblahblah"
  3. Во время потоковой передачи всего видео ваш браузер выполняет несколько сетевых вызовов для загрузки различных фрагментов видео и добавляет их в SourceBuffer MSE
  4. Таким образом, объект Meda Source в целом обновляется во всем видеопотоке
  5. Однако URL-адрес большого двоичного объекта, который изначально был присоединен к элементу , который должен представлять объект Media Source, остается постоянным.

Для меня это не имеет особого смысла.Предполагается, что URL-адреса BLOB-объектов представляют собой фрагменты неизменяемых данных, которые никогда не изменяются.Но похоже, что MSE может заставить их представлять собой изменяемый буфер памяти.

Как это работает под капотом?И если мы также хотим, чтобы URL-адреса больших двоичных объектов представляли собой изменяемый буфер памяти, как мы можем сделать это сами с помощью JavaScript?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Blob URL, используемый для MediaSource, является особым случаем.MediaSource - это особый случай.

Концепция, согласно которой

URL-адреса BLOB-объектов должны представлять собой фрагменты неизменяемых данных, которые никогда не изменяются.

не обязательно правда.Рассмотрим Blob URL, который содержит, например, HTML и JavaScript.Из этого оригинала Blob URL могут быть получены дополнительные данные, включая дополнительные Blob URL s.

0 голосов
/ 10 февраля 2019

Вы должны понимать, что BlobURI не представляют никаких данных .Это просто ссылки, указывающие на некоторый ресурс в памяти, точно так же, как строка https://stackoverflow.com/questions/54613972 не содержит ничего из того, что вы читаете как таковое, она просто указывает на инструкцию сервера, которая затем сгенерирует страницу.

Их ссылку можно назвать неизменной, после того как вы сгенерировали ее с помощью URL.createObjectURL(target), вы не можете изменить ее target, как если бы вы использовали ключевое слово const.

Возьмем, к примеру, const foo = {}, теперь foo нельзя установить для чего-то другого, кроме этого объекта. Но объект, на который указывает foo адрес, все еще изменчив.foo.bar = 'baz' еще можно сделать.

const foo = {};
try{
  foo = 'fails';
}
catch(e) {
  console.error(e);
}
foo.mutable = true;

console.log(foo);

Ну, для blobURI это то же самое.BlobURI указывает на объект targe, эту ссылку нельзя изменить, но target все еще изменчив.Это верно для объектов MediaSource, но также и для других.

Если вы помните, несколько лет назад мы все еще могли использовать blobURI для MediaStreams (это была плохая идея), это был тот же процесс, который указывал blobURI.к объекту MediaStream, не изменяемым образом, но медиа-данные находились в постоянной мутации (поток).

И даже для Файлов вы можете очень хорошо иметь blobURI, который указывает на Файл наваш жесткий диск, это не помешает вам удалить его с жесткого диска, даже если blobURI теперь нигде больше не указывает.

Один особый случай в этом отношении - это случай Blob, сгенерированный изданные в памяти (т.е. не просто указатель на файл на диске).Здесь данные, хранящиеся в Blob, являются неизменяемыми, поэтому в этом случае blobURI действительно указывает на объект, который содержит неизменяемые данные.

И вы запрашиваете, чтобы blobURI указывал на некоторые данные, хранящиеся в памяти,но все же иметь возможность изменять эти данные, это не может быть сделано ...
Это потому, что этот сценарий подразумевает, что вы создали свой blobURI из объекта Blob, используя данные в памяти, которая снова сохраняет данные в неизменяемомсостояние.

...