Как поддерживать синхронизацию потокового видео с MediaSource?

У меня есть серверное приложение, которое рендерит видеопоток с частотой 30 кадров в секунду, затем кодирует и мультиплексирует его в режиме реального времени вWebM Byte Stream.

На стороне клиента страница HTML5 открывает WebSocket для сервера, который начинает генерировать поток, когда соединение принято. После доставки заголовка каждый последующий фрейм WebSocket состоит из одного WebM SimpleBlock. Ключевой кадр появляется каждые 15 кадров, и когда это происходит, запускается новый кластер.

Клиент также создаетMediaSourceи, получив кадр от WS, добавляет содержимое в свой активный буфер.<video> воспроизведение начинается сразу после добавления первого кадра.

Все работает достаточно хорошо. Моя единственная проблема заключается в том, что дрожание сети вызывает отклонение позиции воспроизведения от фактического времени через некоторое время. Мое текущее решение состоит в том, чтобы подключиться кupdateend событие, проверьте разницу междуvideo.currentTime и тайм-код на входящем кластере и вручную обновитьcurrentTime если он выходит за пределы допустимого диапазона. К сожалению, это вызывает заметную паузу и скачок в воспроизведении, что довольно неприятно.

Решение также кажется немного странным: я точно знаю, где находится последний ключевой кадр, но мне нужно преобразовать его в целую секунду (согласно спецификации W3C), прежде чем я смогу передать его вcurrentTimeгде браузер, вероятно, должен затем обойти и найти ближайший ключевой кадр.

У меня такой вопрос: есть ли способ заставить Медиа Элемент всегда искать последний доступный ключевой кадр или синхронизировать время воспроизведения с временем системных часов?

Ответы на вопрос(1)

Ваш ответ на вопрос