Ок, вот в одном сообщении:
1) на фронте:
— navigator.mediaDevices.getUserMedia
— MediaRecorder
по-чанковая передача видеопотока в node.js через поток по сокету
2) в ноде socket.io
и запись чанков в отдельные файлы webm
Проблема в том, что при передача чанка видео в ноду, там передается blob-кусок данных, которых недостаточно, чтобы сформировать корректный webm-файл. Это конкретно косяки формата webm (матроска-контейнер). Есть решение прогонять каждый чанк через ffmpeg, но это удар по процессору, а предполагается highload. Думаем о том, чтобы конвертировать видео на стороне клиента (пусть лучше нагружается клиент), но не понятно, как брать чанк каждый новый чанк. Первый ок — идет с заголовками, при сохранении через window.URL.createObjectURL(blobData) — все збс, проигрывается потом. А вот последующие уже идут без заголовков (вероятно), т.к. при сохранении через createObjectURL не проигрываются. Нужно в итоге, чтобы каждый чанк превращался в отдельный видеофайл, тогда репликейт-сервер будет формировать пополняющийся плейлист, который пойдет на бродкаст.
На сафари мы хуй ложили, работаем сейчас строго с теми, кто поддерживает MediaRecorder — хром, лис, эдж.
Чего удалось добиться:
1) на лету на клиенте генерировать первый чанк, который корректно открывается. Понятно, что раз он сгенерирован, то можно потом присунуть его в качестве файла в POST-запрос и отправить на сервер. Но об этом можно думать, если новый чанк корректно сохранится. Пока новый не проигрывается (походу проблема заголовков). Можно, конечно, каждый раз инициировать MediaRecorder, но тогда теряются куски видео.
2) удалось четко и без потерь получать чанки на сервере, но из-за отсутствия заголовков это вообще не спасает.
Было бы здорово проконсультироваться с кем-то, кто уже игрался с трансляциями в целом и MediaRecorder в частности, чтобы:
— либо конвертировать все это на стороне клиента (получать из чанка корректный видеофайл и слать его на сервер)
— либо, возможно, дописывать мету руками (пока непонятно, как именно, у нас нет такого опыта работы с контейнером, чтобы разобрать его на запчасти и понять, где зарыты косяки с заголовками).
— либо еще какой-то неочевидный вариант, до которого мы пока не дошли.
Что мешает инициировать передачу сервисным пакетом, писать чанки в duplexStream и прекращать передачу сервисным пакетом?