Как определить начальные и конечные байты запроса диапазона HTTP (nodejs + mongodb)

Интересно, можно ли определить начальный и конечный байты в запросах диапазона HTTP или позволить браузеру каким-то образом узнать, с чего начать, и позволить ему использовать определенный пользователем размер фрагмента или около того. У меня есть файл в моей базе данных, и он разбит на несколько частей, каждая часть составляет 2 МБ.

например. Файл 20 МБ => 10 чанков

Когда браузер начинает скачивать файл (видео файл), я изучил Chrome, он сначала проверяет диапазон 'range=bytes 0-' байт и если сервер успешно отвечает "правильными" байтами и 206 заголовками обратно, то отправляет еще один запрос на конечные байты файла, например 'range=bytes 1900000-',

Он просто проверяет, хорошо ли ваш сервер отвечает на частичный ответ.

На стороне сервера я закодировал свое приложение так, чтобы оно отправляло частичные 2 МБ, если вы хорошо попросите об этом :)

Что я хочу, чтобы браузер делал

range=bytes 0-'

range=bytes 2000000-4000000 bytes'

range=bytes 4000000-6000000 bytes'

Но если вы спросите частичный файл, который не помещается в блок размером 2 МБ, он выдаст ошибку. Или он просто не будет воспроизводиться с правильной позиции для аудио/видеофайла.

range=bytes 2500000-4000000 bytes'

range=bytes 0-1000000 bytes'

это выдаст ошибку, потому что я не могу начать отправку с части чанка. В противном случае мне придется нарезать свои куски и выполнить некоторые операции с буфером. Но я хочу содержать его в чистоте. Если это возможно, пожалуйста, дайте мне знать.


person webmaster    schedule 27.10.2016    source источник


Ответы (1)


Я предполагаю, что вы транслируете файл mp4? Различные части (блоки) mp4 имеют разные цели, невозможно перейти к случайной позиции в файле и начать воспроизведение без предварительного определения местоположения каждого кадра путем предварительной загрузки индекса (moov). Moov может быть в начале или в конце файла, поэтому браузеру МОЖЕТ сначала понадобиться конец файла. Определить это он может, начав с начала, и ища moov, если его нет на старте, будет указатель на расположение следующего ящика. Он может прыгать по файлу, пока не найдет индекс. Как только заголовок moov загружен, браузер будет знать ТОЧНОЕ смещение в байтах и ​​размер каждого отдельного кадра в видео и может перемещаться по файлу по мере поиска. Все это возможно, потому что браузер умеет парсить mp4 изначально. TLDR. Нет, ваше решение не сработает.

person szatmary    schedule 27.10.2016
comment
Я реализую частичные загрузки не только для mp4, но и для других типов файлов, например аудиофайлов, файлов iso и т. д. Не знал об индексе moov. Но мне любопытно, как это работает с gridfs MongoDB. Драйвер mongodb nodejs также разбивает файл на куски, и когда я хочу получить файл, mp4 отлично начинает потоковую передачу, и его можно искать. Они определенно нарезают длину буфера чанка, чтобы соответствовать запрошенному диапазону байтов и т. Д. Но я еще не там, спасибо за информацию. - person webmaster; 27.10.2016