2012-04-13 21 views
6

Domandautilizzando JavaScript/jQuery per accedere al contenuto immagine per un frame in un video

voglio scrivere codice efficiente per il gioco/manipolare le immagini in un browser Web utilizzando JavaScript. Penso che l'uso di un file video possa ridurre le richieste http. Come posso accedere a una versione png/jpg/bytecode di un singolo frame da un video?

Sfondo

Attualmente, ho una sequenza di ~ 1000 immagini, che variano sempre così un po ', che devono essere rapidamente accessibili sulla mia pagina. caricare le immagini tramite richieste HTTP richiede sempre (ovviamente) e man mano che la mia app cresce, è probabile che questo numero cresca da 1000 a 5000 a 10.000 ...

Le richieste Ajax per le singole immagini non funzioneranno, b/c Ho bisogno di caricare immediatamente l'immagine (e non ho il tempo di aspettare una nuova richiesta http).

La mia idea era di pre-elaborare un file video sul server che mostra l'avanzamento dell'immagine, un'immagine per fotogramma, per accelerare la velocità di download e le prestazioni del browser. Mi sento come se questo video potesse essere scaricato velocemente dal client in base alla velocità di visione dei video online. Mi sto bloccando su come ottenere il contenuto dell'immagine per una cornice fuori dal video.

HTML5?

Nota, non ho ancora esaminato l'HTML5, ma sarei disposto a considerare se può essere d'aiuto.

+1

Poiché le immagini variano leggermente da un'immagine all'altra, alcuni formati di compressione video salvano solo le differenze tra i fotogrammi rendendo il video più piccolo di tutti i singoli fotogrammi, o almeno così credo. Inoltre, sarà necessario un minor numero di richieste http per scaricare un filmato – Rishi

risposta

14

È possibile disegnare fotogrammi video su tela html5.

Ho creato this violino combinando this e this.

Il punto chiave è ottenere il fotogramma video corrente e disegnarlo nell'elemento canvas.

var delay=20; 
function draw(cvideo,ccanvas,canvas_width,canvas_height) { 
    if(cvideo.paused || cvideo.ended) return false; 
    ccanvas.drawImage(cvideo,0,0,canvas_width,canvas_height); 
    setTimeout(draw,delay,cvideo,ccanvas,canvas_width,canvas_height); 
} 

Dopo averlo inserito nella tela, è possibile fare quasi tutto con l'immagine.

+0

Mi piace questo suggerimento. Inoltre, sembra che posso passare a un frame particolare utilizzando l'impostazione currentTime: "video.currentTime = starttimeoffset;" basato su http: //blog.gingertech.net/2009/08/19/jump-to-time-offset nei video/ – Rishi

+0

Best Answer e Bounty perché risponde in modo specifico alla domanda che ho chiesto a – Rishi

+0

è possibile ottenere i frame direttamente dal file video invece di utilizzare

2

Invece di utilizzare un file video è possibile utilizzare image sprites - in pratica combinare più immagini in un'unica grande immagine, di cui si mostra sempre solo la regione appropriata (supponendo che tutte le immagini abbiano le stesse dimensioni sarebbe facile) - questo sarebbe in gran parte ridurre il numero di richieste HTTP necessarie e accelerare il processo di caricamento a sua volta.

+0

Buona idea, questo riduce le richieste HTTP, ma non riduce la quantità totale di informazioni che devono essere scaricate - Vedi il mio commento. – Rishi

+0

@Rishi, le immagini combinate in uno sprite peseranno molto meno delle immagini originali e fare una richiesta HTTP lunga sarà molto più breve di 1000 quelle abbinate così ... – Headshota

+0

Gli sprite sembrano un ottimo metodo e potrebbero essere una buona alternativa se la soluzione del nome utente non funziona. Grazie per il consiglio però. – Rishi

Problemi correlati