Possiedo un'applicazione server che esegue il rendering di 30 flussi video FPS, quindi la codifica e la mux in tempo reale in un WebM Byte Stream.Come mantenere un flusso video live di MediaSource in-sync?
Sul lato client, una pagina HTML5 apre un WebSocket al server, che inizia a generare il flusso quando viene accettata la connessione. Dopo la consegna dell'intestazione, ogni frame WebSocket successivo è costituito da un singolo SimpleBlock WebM. Un fotogramma chiave si verifica ogni 15 fotogrammi e quando questo accade viene avviato un nuovo Cluster.
Il client crea anche un MediaSource e quando riceve un frame dal WS, aggiunge il contenuto al suo buffer attivo. <video>
avvia la riproduzione immediatamente dopo l'aggiunta del primo fotogramma.
Tutto funziona ragionevolmente bene. Il mio unico problema è che il jitter di rete fa in modo che la posizione di riproduzione si sposti dal tempo reale dopo un po '. La mia soluzione attuale è agganciare l'evento updateend
, controllare la differenza tra lo video.currentTime
e il codice di tempo sul Cluster in arrivo e aggiornare manualmente lo currentTime
se non rientra nell'intervallo accettabile. Sfortunatamente, questo provoca una pausa notevole e salta nella riproduzione che è piuttosto spiacevole.
La soluzione si sente anche un po 'strano: io so esattamente dove l'ultimo fotogramma chiave è, eppure devo convertirlo in un intero secondo (secondo le specifiche W3C) prima che io possa passare in currentTime
, in cui il browser presumibilmente deve quindi andare in giro e trovare il fotogramma chiave più vicino.
La mia domanda è questa: c'è un modo per dire all'elemento multimediale di cercare sempre l'ultimo fotogramma chiave disponibile o mantenere l'ora di riproduzione sincronizzata con l'ora dell'orologio di sistema?
Hai trovato una soluzione? –
Mi sono reso conto che la soluzione per cambiare il tempo corrente è la migliore, i difetti che causa sono accettabili perché prima che un problema di rete ha causato l'aumento del buffer, quindi un altro problema tecnico è normale ... rimarrà solo con glitch se ci sono problemi di connessione consecutivi durante lo streaming. –