It depends a lot on how you actually deploy the M-JPEG frames, and if you have to use the built-in browser support or you can write your own javascript.
Background
Keep in mind that when streaming M-JPEG from the server, it simply sends a number of JPEG files, but as a response to a single web request. That is, a regular web request looks like
Client Server
| --- Request ---> |
| |
| <-- JPEG File -- |
So far, the M-JPEG request is more like
Client Server
| --- Request ---> |
| |
| <- JPEG part 1 - |
| <- JPEG part 2 - |
| <- JPEG part 3 - |
, , , M-JPEG , , .
Pure JS Solution
javascript , , / . javascript ( JPEG). javascript ,
-, javascript , TCP-. Keep-Alive , Spdy HTTP/2 , Nginx, javascript. , javascript , , .
( jQuery imgload plugin ):
var timeout = 250;
var image =
var accumulatedError = 0;
var doFrame = function(frameId) {
var loaded = false, timedOut = false, startTime = (new Date()).getTime();
$(image).bind("load", function(e) {
var tardiness = (new Date()).getTime() - startTime - timeout;
accumulatedError += tardiness;
accumulatedError = Math.max(accumulatedError, 0);
if (!timedOut) {
loaded = true;
} else {
doFrame(frameId + 1);
}
}
var timeCallback = function() {
if (loaded) {
doFrame(frameId + 1);
} else {
timedOut = true;
}
}
while(accumulatedError > timeout) {
frameId += 1;
accumulatedError -= timeout;
}
$(image).src = "http://example.com/images/frame-" + frameId + ".jpg";
setTimeout(timeCallback, timeout);
}
doFrame(1);
, , , , (, ).
-
javascript , , , . , 4 , , 250 , 250 . , . , , , , , - TCP ..
, (. ), Websockets . , Nginx -.
-. jpeg- , (, 30 20-25 , , , , , ). , , .
, , accumulatedError , , ( ). accumulatedError (, , ), reset accumulatedError.
, , , , , . - PID PID loop, , PID, , , accumulatedErrror - ( ) .