Ответ 1
джиттер сети приводит к дрейфу позиции воспроизведения
Это не твоя проблема. Если вы столкнулись с отсева в потоке, вы не буферизуете достаточно до начала воспроизведения, а воспроизведение имеет буфер соответствующего размера, даже если на несколько секунд отстает от реального времени (что нормально).
Мое текущее решение - подключиться к событию updateend, проверить разницу между video.currentTime и временным кодом входящего кластера
Это близко к правильному методу. Я предлагаю вам игнорировать временный код входящего кластера и вместо этого проверять ваши буферизированные диапазоны времени. То, что вы получили в кластере WebM, и то, что было декодировано, - это две разные вещи.
К сожалению, это вызывает заметную паузу и скачок в воспроизведении, что довольно неприятно.
Как еще вы это сделаете? Вы можете либо перейти в реальном времени, либо увеличить скорость воспроизведения, чтобы догнать до реального времени. В любом случае, если вы хотите догнать в реальном времени, вам нужно пропустить это время.
Решение также немного странно: я точно знаю, где находится последний ключевой кадр
Вы можете, но игрок не делает это, пока этот носитель не будет декодирован. В любом случае ключевой кадр не имеет значения... вы можете искать места без ключевых кадров. Браузер будет декодировать перед P/B-кадрами по мере необходимости.
Мне нужно преобразовать его в целую секунду (по спецификации W3C), прежде чем я смогу передать его в currentTime
Это абсолютно неверно. currentTime
указывается как double
. https://www.w3.org/TR/2011/WD-html5-20110113/video.html#dom-media-currenttime
Мой вопрос заключается в следующем: есть ли способ сообщить Media Element всегда искать доступный последний ключевой кадр или синхронизировать время воспроизведения с системным часовым временем?
Он будет автоматически воспроизводить последний буфер. Вам не нужно ничего делать. Вы выполняете свою работу, гарантируя, что медиаданные попадают в буфер и устанавливают воспроизведение как можно ближе к этому. Вы всегда можете продвигать его вперед, если меняется состояние сети, что позволяет вам это делать, но, откровенно говоря, это звучит так, как будто вы просто сломали код и сломанную стратегию буферизации. В противном случае воспроизведение будет простым.
Захват, если он отстает, не будет происходить автоматически, и не должен. Если игрок делает паузу из-за слива буфера, буфер необходимо снова создать резервную копию до возобновления воспроизведения. То, что вся точка буфера.
Кроме того, ваше ожидание сохранения чего-либо вовремя с системными часами не является хорошей идеей и необоснованно. Различные устройства имеют разные частоты обновления, будут обрабатывать видео по разным скоростям. Просто нажмите на игру и дайте ей поиграть. Если вы закончите несколько секунд, продолжайте и установите currentTime
, но будьте очень уверены в том, что вы забуферили, прежде чем это сделать.