HTTP Live Streaming на чистом Javascript

в 16:54, , рубрики: javascript, ненормальное программирование, Работа с видео, метки:

Недавно опубликовал в open-source напиленный за пару месяцев эксперимент (или proof-of-concept, как больше нравится): github.com/RReverser/mpegts.

Это работающий прототип реализации Apple HTTP Live Streaming (вкратце — один из трех популярных протоколов потокового видео), написанный вручную на JavaScript. Он реализован на основе конвертации отдельных чанков MPEG-TS из оригинального манифеста потока в уже поддерживаемый практически всеми браузерами MP4 (а конкретнее, H264+AAC) непосредственно в браузере в отдельном потоке, и последующем проигрывании сконвертированных чанков в основном потоке.

Преобразование осуществляется с помощью параллельно разработанной библиотеки для манипуляции с бинарными данными в JavaScript — jBinary (о ней в другой раз), с программно описанными структурами данных в соответствии со стандартами ISO 13818-1, ISO-14496-2, ISO-14496-12 и ITU-T H.222.0. Естественно, спецификации реализованы не полностью, но в достаточных для реализации указанных форматов границах, так как чтение сухо технического текста и попытка реализации описанных и придуманных авторами вещей зачастую вызывает желание накуриться того же, чего и они («для меток времени вам было мало 32-битных чисел и вы решили сохранять метки времени в 33 битах, разбитых на отдельные части и перемешанные с незначущими битами, чтобы „добить“ до 40 бит, которые „удобнее“ сохранить? серьезно ***?» ну и в таком роде), а такая трава, видимо, выдается только авторам спек и разработчикам не положена :(

Проверено и работает в последних Chrome (стабильной ветке), Firefox и IE10+, отставания при переключении между отдельными чанками на самом деле заметны везде, но индивидуально — в Chrome ощущаются меньше всего. Есть отзывы, что в Safari демка конвертирует чанки, но не играет собственно сконвертированные MP4, но проверить и подебажить причины у самого нет особой возможности. Устранить задержки в будущем можно будет с повсеместным приходом в браузеры Media Source Extensions.

Репозиторий: github.com/RReverser/mpegts.
Демка: rreverser.github.io/mpegts/.

Любые вопросы, форки и помощь в виде доработок приветствуется :)

P.S. Хочу также обратить внимание, что демка использует чужой поток и отдельный сервис www.corsproxy.com/ для его проксирования с необходимыми CORS-заголовками для браузеров, так что устойчивость к нагрузке не гарантируется.

Автор: RReverser

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js