Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Javascript/jquery to access picture content for a frame in a video

Question

I want to write efficient code for playing/manipulating images in a web browser using JavaScript. I think using a video file may cut down http requests. How can I access a png/jpg/bytecode version of a single frame from a video?

Background

Currently, I have a sequence of ~1000 images, which vary ever-so-slightly, that need to be quickly accessible on my page. loading the images via HTTP requests is taking forever(obviously), and as my app grows, it is likely that this number will grow from 1000 to 5000 to 10,000 ...

Ajax requests for individual images will not work, b/c I need the image to load immediately (and don't have time to wait for a new http request).

My idea was to pre-process a video file on the server which shows the image progression- one image per frame-to speed up the rate of download and the browser's performance. I feel like this video could download to the client quickly based on the speed of watching videos online. I'm getting stuck on how to get picture content for a frame out of the video.

HTML5?

Note, I haven't looked into HTML5 yet, but would be willing to consider if it may help.

like image 964
Rishi Avatar asked Apr 13 '12 06:04

Rishi


2 Answers

You can draw video frames to html5 canvas.

I created this fiddle by combining this and this.

Key point is getting the current video frame and drawing it into the canvas element.

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);
}

After getting it into canvas you can do almost anything with the image.

like image 140
username Avatar answered Nov 14 '22 21:11

username


Instead of using a video file you could use image sprites - basically combine multiple images into a single big image, of which you only always show the appropriate region (assuming all images have the same dimensions this would be easy) - this would largely reduce the number of necessary HTTP requests and speed up the loading process in turn.

like image 24
BrokenGlass Avatar answered Nov 14 '22 22:11

BrokenGlass