Я предполагаю, что видео, получаемое при запуске, нуждается в заголовках инициализации для запуска, и поскольку поток читается в среднем потоке, он никогда не получит указанные заголовки инициализации.
Правильно!
Чтобы решить эту проблему, вам нужно немного узнать о формате WebM. WebM - это всего лишь подмножество Matroska (MKV). Matroska - это спецификация схемы хранения мультимедиа в EBML. EBML - это двоичный формат файла, который может иметь произвольные блоки. Думайте об этом как о двоичном XML.
Это означает, что вы можете использовать такие инструменты, как EBML Viewer , чтобы проверять файлы WebM и ссылаться на спецификации Matroska, чтобы понять, что происходит. Например:
Это проверка файла WebM, который был предварительно записан. Это будет хорошо играть в браузерах. Вы заметите, что есть вложенные элементы.
В каждом файле WebM есть два элемента верхнего уровня. EBML
, который определяет этот двоичный файл, и Segment
, который содержит все после.
В пределах Segment
есть пара важных для вас элементов. Одним из которых является Tracks
. Вы заметите, что в этом файле две дорожки: одна для аудио в Opus, а другая для видео в VP9. Другим важным блоком является Info
, который содержит информацию о шкале времени и некоторые метаданные о мультиплексоре.
После всех этих метаданных вы найдете Cluster
, Cluster
, Cluster
и т. Д. Это места, в которых вы можете вырезать поток WebM , при условии, что каждый Cluster
начинается с ключевого кадра.
Другими словами, ваш код должен делать следующее:
- Сохранить все данные перед первым
Cluster
как «данные инициализации».
- Разделить на
Cluster
после этого.
При воспроизведении:
- Используйте ранее сохраненные «данные инициализации» как первое, что вы загружаете.
- Начните загрузку через
Cluster
с после этого, начиная с того места, где вы хотите в потоке.
Теперь важно знать, кому нужен кластерный бит. Насколько я знаю, нет способа настроить MediaRecorder для этого, и браузеры особенно требовательны к этому. Как минимум, вам придется перемаксовать на стороне сервера ... возможно, вам даже придется перекодировать. См. Также: Кодирование FFMPEG в MPEG-DASH - или WebM с кластерами ключевых кадров - для MediaSource API
с использованием медиаисточника с socket.io
Я должен отметить, что вам даже не нужен MediaSource для этого. Вам определенно не нужен Socket.IO. Это может быть так же просто, как вывод этих данных через обычный поток HTTP. Это загружается непосредственно в элементе <video>
. (Обязательно используйте MediaSource, если вам нужен дополнительный контроль, но это не обязательно.)