Sto utilizzando WebRTC
per inviare video da un server al browser client (utilizzando il server nativo WebRTC API
e un server MCU WebRTC
come Kurento).Sincronizzazione dei dati con video tramite WebRTC
Prima di inviarlo ai client, ogni fotogramma del video conteneva metadati (come i sottotitoli o qualsiasi altro contenuto applicativo). Sto cercando un modo per inviare questi metadati al client in modo che rimanga sincronizzato (al momento in cui è effettivamente presentato). Inoltre, vorrei poter accedere a questi dati dal lato client (tramite Javascript).
Alcune opzioni ho pensato:
- l'invio dei dati da WebRTC DataChannel. Ma non so come garantire che i dati siano sincronizzati su una base per frame. Ma non sono riuscito a trovare un modo per garantire i dati inviati dal canale dati e il canale video è sincronizzato (di nuovo, spero di ottenere il livello di precisione del singolo fotogramma).
- Invio manuale dei dati al client in qualche modo (WebRTC DataChannel, websocket, ecc.) Con data e ora che corrispondono ai timestamp del video. Tuttavia, anche se Kurento o altri server centrali conservano le informazioni relative al timestamp nel video, in base alla seguente risposta non esiste un modo applicativo per ottenere il timestamp del video dal javascript: How can use the webRTC Javascript API to access the outgoing audio RTP timestamp at the sender and the incoming audio RTP timestamp at the receiver?. Ho pensato di utilizzare l'evento
timeupdate
dell'elemento video standard, ma non so se funzionerà per il livello di precisione del fotogramma e non sono sicuro di cosa significhi in un video live come in WebRTC. - Inviare manualmente i dati e collegarli al video come un altro
TextTrack
. Quindi utilizzareonenter
eonexit
per leggerlo in modo sincronizzato: http://www.html5rocks.com/en/tutorials/track/basics/. Richiede ancora timestamp precisi, e non sono sicuro di sapere quali sono i timestamp e se Kurento li passa così com'è. - Utilizzo dell'API statistiche di WebRTC per contare manualmente i frame (utilizzando
getstats
) e sperare che le informazioni fornite da questa API siano precise.
Qual è il modo migliore per farlo e come risolvere i problemi che ho menzionato in entrambi i modi?
MODIFICA: È richiesta una sincronizzazione precisa (in risoluzione di non più di un singolo fotogramma) di metadati con la cornice appropriata.
Non potrai mai ottenere flussi sincronizzati perfetti se li separi. È possibile implementare un sistema di buffering per garantire l'assenza di avanzamento finché non è disponibile un buffer accettabile in entrambi i flussi. La soluzione migliore è quella di dimenticare la perfetta corrispondenza fotogramma per fotogramma, se lo si desidera, quindi codificarlo nel flusso video come video al volo. A parte l'audio e la grafica, non riesco a pensare al motivo per cui avresti bisogno di una precisione così elevata. Si dimentica che il tempismo perfetto diventa molto più semplice. – Blindman67
Grazie, buon punto. Ad ogni modo la domanda è su come farlo a livello di codice, supponendo che potrei garantire che il flusso di metadati sia già stato raggiunto nel browser prima del flusso video. Il tuo suggerimento di ricodificare il video sembra piacevole, ma devo ancora abbinare i tempi del flusso video e del flusso dei metadati. Non sono nemmeno sicuro che il middle server conservi i timestamp della presentazione. – MaMazav
Gli stream multimediali forniscono un aiuto. Se stai usando un video HTML5 puoi usare il buffered per restituire un oggetto TimeRanges per farti sapere cosa è stato memorizzato nel buffer. L'interfaccia HTMLMediaElement fornisce currentTime come attributo di lettura read. Puoi usarlo per ottenere il tempo in secondi del video. Per ottenere il numero di fotogramma corrente 'frameNumber = Math.floor (videoElement.currentTime/frameRate);' Scrittura su currentTime causerà la ricerca del video fino a quel momento. – Blindman67