Может ли javascript на стороне клиента создать загрузку файла, которая слишком велика для размещения в памяти?

Я использую captureStream для записи с холста HTML , и в настоящее время используйте пример кода в https://developer.mozilla.org/en-US/docs/Web/API/MediaStream_Recording_API. Однако это работает только для коротких записей, поскольку каждый большой двоичный объект хранится в памяти.

Я хотел бы иметь возможность записывать в течение длительного периода времени, например. >1 час и позволить пользователю загрузить полученный файл .webm/.mkv. Если это звучит необычно, то это потому, что я использую веб-браузер для научного приложения (с открытым исходным кодом) и мне нужно знать, что отображалось во время эксперимента :).

Достаточно просто адаптировать код MDN для хранения каждого большого двоичного объекта в IndexedDB вместо массива в памяти, но я застрял на том, как сконструировать загрузку, не создавая огромный большой двоичный объект, который исчерпал бы память:

var blob = new Blob([IDBchunk1, IDBchunk2, ...], {
  type: "video/webm"
});

Другой подход — создать «потоковую» загрузку, но не уверен, что это возможно.

Одним из работоспособных, но ужасно неэффективных решений является использование WebRTC для отправки потока обратно на сервер nodejs, добавление каждого большого двоичного объекта к видеофайлу на диске на сервере, а затем загрузка видео через http. Мне не нравится это решение, так как оно связано со сложностью настройки webRTC + требует большой пропускной способности туда и обратно.

Дайте мне знать, если у вас есть какие-либо мысли о том, как сделать это только на стороне клиента?


person tbenst    schedule 03.01.2020    source источник


Ответы (1)


По крайней мере, в Chrome подход new Blob([IDBchunk1, IDBchunk2, ...]...) не требует загрузки каких-либо BLOB-объектов в память. Новый большой двоичный объект внутренне ссылается на зависимые большие двоичные объекты или файлы, а чтение большого двоичного объекта (например, во время загрузки) извлекает байты из зависимых больших двоичных объектов по мере необходимости.

person Joshua Bell    schedule 04.01.2020
comment
Да, я думаю, вы правы, и IndexedDB не нужен. Похоже, что Chrome, по крайней мере, будет автоматически переносить большие двоичные объекты из памяти в файл по мере необходимости: chromium.googlesource.com/chromium/src/+/master/storage/browser/ - person tbenst; 04.01.2020