Sto lavorando a un progetto sul lato client che consente a un utente di fornire un file video e applicare le manipolazioni di base ad esso. Sto cercando di estrarre i frame dal video in modo affidabile. Al momento ho un <video>
quale sto caricando il video selezionato in, e poi tirando fuori ogni fotogramma come segue:JavaScript: estrarre i frame video in modo affidabile
- cercare l'inizio
- in pausa il video
- Disegnare
<video>
ad un<canvas>
- Cattura la cornice dalla tela con
.toDataUrl()
- Cercare avanti di 1/30 secondi (1 fotogramma).
- sciacquare e ripetere
Questo è un processo piuttosto inefficiente, e più in particolare, si sta rivelando inaffidabili come sto spesso rimanere bloccati fotogrammi. Questo sembra non aver aggiornato l'effettivo elemento <video>
prima di disegnare sul canvas.
Preferisco non dover caricare il video originale sul server solo per dividere i frame e quindi scaricarli nuovamente sul client.
Qualsiasi suggerimento per un modo migliore di farlo è molto apprezzato. L'unica avvertenza è che ho bisogno che funzioni con qualsiasi formato supportato dal browser (la decodifica in JS non è una grande opzione).
invece di cercare 1/30s in avanti, si dovrebbe allegare una funzione sul 'timeupdate' evento del video. Ma chiaramente, se non hai bisogno di farlo sul lato client, non utilizzare un browser per questo, ffmpeg o qualsiasi strumento video sarà più potente per questo. – Kaiido
@Kalido Preferisco piuttosto gestire il lato server, ma il video proviene dal client e ho bisogno dei frame sul client, quindi se posso evitare un ciclo di upload/download, starei molto meglio. Inoltre, per quanto riguarda la ricerca, ho riscontrato problemi con i dispositivi lenti che perdono i frame perché non riescono a gestire i dati del frame abbastanza velocemente, tuttavia, non ho familiarità con l'evento 'timeupdate', quindi lo esaminerò . Inoltre, specificando il tempo di ricerca per ciascun fotogramma, posso controllare il framerate se necessario. –
Ok, quindi per favore potresti chiarire questo punto (che è per un sito web, lato client) in una modifica alla tua domanda, che non era affatto chiaro. Inoltre, il framerate nel browser non è assolutamente costante, quindi non dovresti fare affidamento su di esso. Ma ad ogni nuova cornice dipinta, l'evento timeupdate dovrebbe attivarsi, quindi credo che sarà più affidabile. – Kaiido