Wie halte ich einen Live-MediaSource-Videostream synchron?

Ich habe eine Serveranwendung, die einen 30 FPS-Videostream rendert, dann verschlüsselt und in Echtzeit in eine Mux-Datei umwandeltWebM Byte Stream.

Auf der Clientseite öffnet eine HTML5-Seite ein WebSocket für den Server, das den Stream generiert, wenn die Verbindung akzeptiert wird. Nach der Übermittlung des Headers besteht jeder nachfolgende WebSocket-Frame aus einem einzelnen WebM SimpleBlock. Alle 15 Frames wird ein Keyframe erstellt. In diesem Fall wird ein neuer Cluster gestartet.

Der Client erstellt auch eineMediaSourceHängt beim Empfang eines Frames vom WS den Inhalt an den aktiven Puffer an. Das<video> Startet die Wiedergabe sofort, nachdem das erste Bild angehängt wurde.

Alles funktioniert einigermaßen gut. Mein einziges Problem ist, dass der Netzwerk-Jitter dazu führt, dass die Wiedergabeposition nach einer Weile von der tatsächlichen Zeit abweicht. Meine derzeitige Lösung besteht darin, sich in dieupdateend Event, überprüfen Sie den Unterschied zwischen demvideo.currentTime und den Timecode auf dem eingehenden Cluster und aktualisieren Sie dencurrentTime wenn es außerhalb eines akzeptablen Bereichs liegt. Dies führt leider zu einer merklichen Pause und einem unangenehmen Sprung in der Wiedergabe.

Die Lösung fühlt sich auch ein bisschen seltsam an: Ich weiß genau, wo sich der neueste Keyframe befindet, aber ich muss ihn in eine ganze Sekunde (gemäß der W3C-Spezifikation) konvertieren, bevor ich ihn weitergeben kanncurrentTime, wo der Browser dann vermutlich herumgehen und den nächsten Keyframe finden muss.

Meine Frage lautet: Gibt es eine Möglichkeit, das Media Element anzuweisen, immer nach dem neuesten verfügbaren Keyframe zu suchen oder die Wiedergabezeit mit der Systemuhrzeit synchron zu halten?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage