Как начать воспроизведение потокового видео не с его начала?
Идея такая:
Я захватываю видео и аудио с помощью navigator.getUserMedia.
Начинаю запись с помощью MediaRecorder где с некой периодичностью получаю chunk данных в формате Uint8Array который я отправляю на сервер.
Другие клиенты подключаются к серверу и начинают получать эти chunk’и и воспроизводить у себя приблизительно следующим кодом:
connection.on(“chunk”, chunk => {
Chunks.push(chunk);
Video.src = window.URL.createObjectURL(new Blob(Chunks, mimeType));
Video.play();
}
И таким образом они начинают в режиме реального времени видеть то что снимает на камеру «стример».
Но тут есть 2 существенных проблемы которые по сути исходят из одной причины.
1. При получении каждого нового chunk’a с сервера воспроизведение начинается сначала что собственно логично ибо код так и написан. Дело в том, что я не могу динамически добавлять chunk в конец текущего видео что бы воспроизведение не обновлять. Если вы хотите тут посоветовать MediaSource то не поленитесь пожалуйста привести собственный рабочий пример его использования с Uint8Array chunk’ами например на JSfiddle ибо я с этим классом уже настолько себе мозг изнасиловал...он у меня так и не заработал. По этому те примеры которые вы найдёте в гугле я наверняка уже видел и пробовал.
2. Нужно уметь стартовать стрим из любого chunk’a. Например стрим идет уже 2 часа и на сервере уже имеется 100500 chunk’ов. При подключении нового зрителя ему нужно отдавать только все новые chunk’и а не заставлять качать все предыдущие. В моей текущей ситуации качать нужно все и все работает до того момента покуда целостность потока не нарушена. Если я уберу один любой chunk из массива - после конвертации этого самого массива в Blob - видео больше не запустится в HTML элементе под названием video.
Просто так на части делить не получится. У видео потока есть некий формат, который рушится, если отдавать его без каких-то частей. Собственно, в первой части всякие заголовки идут про кодек, потоковость, длину неразрывного пакета (например), без этой информации затруднительно что-то расшифровывать.
Ну для смеха, попробовать первый chunk отдавать для соединяющихся в середину.