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

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

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

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

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

2 ответа

Решение

Вы должны понимать, что BlobURI не представляют никаких данных. Это просто ссылки, указывающие на некоторый ресурс в памяти, как строка https://stackru.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, используя данные в памяти, которая снова сохраняет данные в неизменном состоянии.

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

Концепция, которая

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

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

Другие вопросы по тегам