Ich habe eine Server-Anwendung, die einen 30 FPS-Videostream rendert und dann in Echtzeit in eine WebM Byte Stream kodiert und multiplext.Wie Sie einen Live-MediaSource-Videostream synchron halten?
Auf der Client-Seite öffnet eine HTML5-Seite einen WebSocket für den Server, der mit der Generierung des Streams beginnt, wenn die Verbindung akzeptiert wird. Nachdem der Header geliefert wurde, besteht jeder nachfolgende WebSocket-Frame aus einem einzelnen WebM SimpleBlock. Ein Keyframe tritt alle 15 Frames auf und wenn dies passiert, wird ein neuer Cluster gestartet.
Der Client erstellt auch eine MediaSource, und beim Empfang eines Rahmens von der WS, hängt den Inhalt an seinen aktiven Puffer. Die <video>
startet die Wiedergabe sofort nachdem das erste Bild angehängt wurde.
Alles funktioniert einigermaßen gut. Mein einziges Problem ist, dass der Netzwerkjitter dazu führt, dass die Wiedergabeposition nach einiger Zeit von der tatsächlichen Zeit abweicht. Meine aktuelle Lösung ist es, sich in das updateend
Event einzuklinken, den Unterschied zwischen dem und dem Timecode des eingehenden Clusters zu überprüfen und das currentTime
manuell zu aktualisieren, wenn es außerhalb eines akzeptablen Bereichs liegt. Leider verursacht dies eine merkliche Pause und einen Sprung in der Wiedergabe, der eher unangenehm ist.
Die Lösung fühlt sich auch ein bisschen seltsam an: Ich weiß genau, wo der neueste Keyframe ist, aber ich muss ihn in eine ganze Sekunde umwandeln (laut W3C-Spezifikation), bevor ich ihn in currentTime
weitergeben kann, wo der Browser vermutlich muss dann umhergehen und den nächsten Keyframe finden.
Meine Frage ist: Gibt es eine Möglichkeit, dem Media Element mitzuteilen, immer nach dem neuesten verfügbaren Keyframe zu suchen oder die Wiedergabezeit mit der Systemuhrzeit synchronisiert zu halten?
Haben Sie eine Lösung gefunden? –
Ich habe festgestellt, dass Ihre Lösung, um currentTime zu ändern, die beste ist, die Störungen, die es verursacht, ist akzeptabel, weil zuvor ein Netzwerkfehler den Puffer erhöht hat, so ein weiterer Fehler, um es zu beheben ist normal ... es wird nur bleiben mit Störungen, wenn während des Streams fortlaufende Verbindungsprobleme auftreten. –