SourceBuffer.remove (start, end) удаляет весь буферизованный TimeRange (Как обрабатывать поток в реальном времени с MSE?) - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть SourceBuffer с одной записью в .buffered. У меня есть поток в реальном времени необработанных данных h.264, который я кодирую в mp4 и помещаю в SourceBuffer с .appendBuffer(data). Так как это поток данных в реальном времени, мне нужно продолжать очищать буфер, однако именно здесь я сталкиваюсь с моей проблемой. (Т.е. я сталкиваюсь с QuotaExceededError)

Для примера, моя единственная запись в SourceBuffer.buffered имеет временной диапазон 0-10 секунд. Моя попытка привести в порядок буфер - вызвать SourceBuffer.remove(0, 8). Я ожидаю, что мой буфер будет очищен, и у меня останется диапазон 8-10. Однако весь диапазон времени (мой единственный диапазон) удален, и с этого момента все дальнейшие вызовы appendBuffer, похоже, ничего не делают.

Три вопроса, относящиеся к этому вопросу:

  1. Как мне а) остановить .remove от этого поведения или б) принудительно установить новые временные диапазоны в моем буфере, чтобы удалить только "старые" диапазоны.
  2. Почему последующие appendBuffer звонки ничего не делают? Я ожидал бы, что они повторно заполнят SourceBuffer.
  3. Есть ли лучший "MSE" способ обработки потока в реальном времени, когда я не забочусь о возвращении во времени? То есть. Все предоставленные данные могут быть выброшены.

В случае, если происходит какая-то странная проблема с браузером / платформой, я использую Chrome в Ubuntu.

Кроме того, я основываю свой код на https://github.com/xevokk/h264-converter.

1 Ответ

0 голосов
/ 18 ноября 2018

Это все в спецификации MSE.

http://w3c.github.io/media-source/#sourcebuffer-coded-frame-removal

Шаг 3.3. Удалите все мультимедийные данные из этого буфера дорожек, которые содержат начальные временные метки, большие или равные начальному и меньшие, чем удаляемая конечная временная метка.

Таким образом, пользовательский агент удалит все запрошенные вами данные, от 0 до 8 с

Тогда Шаг 3.4. Удалите все возможные зависимости декодирования для кодированных кадров, удаленных на предыдущем шаге, удалив все кодированные кадры из этого буфера дорожки между теми кадрами, которые были удалены на предыдущем шаге, и следующей точкой произвольного доступа после этих удаленных кадров.

Пользовательский агент удалит все кадры, которые зависят от тех, которые вы только что удалили. Благодаря тому, как работает h264 (и все современные видеокодеки), то есть все кадры, следующие от последнего ключевого кадра до следующего ключевого кадра, поскольку ни один из этих кадров теперь не может быть декодирован.

В диапазоне от 8 до 10 с ключевой кадр отсутствует, поэтому все они удалены

Почему последующие вызовы appendBuffer ничего не делают? Я ожидал бы их повторно заполнить SourceBuffer.

Вы удалили данные, согласно спецификации, следующий кадр, который вы добавляете, должен быть ключевым кадром. Если добавленный вами сегмент не содержит ключевой кадр, ничего не будет добавлено.

Если данные, которые вы добавляете, состоят из одного ключевого кадра в начале, за которым следует только P-кадр, то вы не можете удалить ни один кадр в середине, не сделав непригодным для использования все последующие

...