HTML5 Video - How to do a seamless play and/or loop of several videos?












4















How can I reliably play several videos one after another seamlessly? As there is a small pause or flicker between playing 2 videos.



In my particular example I have 3 videos. I need to play all 3 of them seamlessly one after another, and I also need to loop middle video an arbitrary number of times (say 2 or 3). All of that needs to happen seamlessly and consistently across different browsers.



I've been trying everything under the moon, from starting video playback on video end, to using several video tags and hiding and replacing them, I even tried to implement this in Flash, but alas nothing works, and the same problem happens in current Flash as well.



I've seen this (or similar) question asked many times but I haven't seen a reliable solution yet.



Does anyone know a solution to this?










share|improve this question


















  • 1





    I crated a repo with different playlist techniques to see how seamless the different solutions are.

    – totymedli
    Jul 5 '18 at 19:57
















4















How can I reliably play several videos one after another seamlessly? As there is a small pause or flicker between playing 2 videos.



In my particular example I have 3 videos. I need to play all 3 of them seamlessly one after another, and I also need to loop middle video an arbitrary number of times (say 2 or 3). All of that needs to happen seamlessly and consistently across different browsers.



I've been trying everything under the moon, from starting video playback on video end, to using several video tags and hiding and replacing them, I even tried to implement this in Flash, but alas nothing works, and the same problem happens in current Flash as well.



I've seen this (or similar) question asked many times but I haven't seen a reliable solution yet.



Does anyone know a solution to this?










share|improve this question


















  • 1





    I crated a repo with different playlist techniques to see how seamless the different solutions are.

    – totymedli
    Jul 5 '18 at 19:57














4












4








4


4






How can I reliably play several videos one after another seamlessly? As there is a small pause or flicker between playing 2 videos.



In my particular example I have 3 videos. I need to play all 3 of them seamlessly one after another, and I also need to loop middle video an arbitrary number of times (say 2 or 3). All of that needs to happen seamlessly and consistently across different browsers.



I've been trying everything under the moon, from starting video playback on video end, to using several video tags and hiding and replacing them, I even tried to implement this in Flash, but alas nothing works, and the same problem happens in current Flash as well.



I've seen this (or similar) question asked many times but I haven't seen a reliable solution yet.



Does anyone know a solution to this?










share|improve this question














How can I reliably play several videos one after another seamlessly? As there is a small pause or flicker between playing 2 videos.



In my particular example I have 3 videos. I need to play all 3 of them seamlessly one after another, and I also need to loop middle video an arbitrary number of times (say 2 or 3). All of that needs to happen seamlessly and consistently across different browsers.



I've been trying everything under the moon, from starting video playback on video end, to using several video tags and hiding and replacing them, I even tried to implement this in Flash, but alas nothing works, and the same problem happens in current Flash as well.



I've seen this (or similar) question asked many times but I haven't seen a reliable solution yet.



Does anyone know a solution to this?







javascript html5 video






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Dec 4 '15 at 21:33









TanukiTanuki

302416




302416








  • 1





    I crated a repo with different playlist techniques to see how seamless the different solutions are.

    – totymedli
    Jul 5 '18 at 19:57














  • 1





    I crated a repo with different playlist techniques to see how seamless the different solutions are.

    – totymedli
    Jul 5 '18 at 19:57








1




1





I crated a repo with different playlist techniques to see how seamless the different solutions are.

– totymedli
Jul 5 '18 at 19:57





I crated a repo with different playlist techniques to see how seamless the different solutions are.

– totymedli
Jul 5 '18 at 19:57












2 Answers
2






active

oldest

votes


















5














After trying various things I have finally been able to create what seems to be a working solution. I haven't tested this on older browsers or other OSes, but this works on latest versions of Chrome, IE, Firefox and Opera. (Although some more feedback of whether this works on other systems would be appreciated)



The idea is to have all 3 videos output frames to HTML5 canvas. The original videos are hidden and preloaded in advance to avoid pause between loading.



Here is the code:






var playCounter = 0;
var clipArray = ;

var $video1 = $("#video1");
var $video2 = $("#video2");
var $video3 = $("#video3");

$video1.attr("src", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4");
$video2.attr("src", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerJoyrides.mp4");
$video3.attr("src", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerFun.mp4");

var timerID;

var $canvas = $("#myCanvas");
var ctx = $canvas[0].getContext("2d");

function stopTimer() {
window.clearInterval(timerID);
}

$('#startPlayback').click(function() {
stopTimer();
playCounter = $('#playbackNum').val();
clipArray = ;

// addd element to the end of the array
clipArray.push(1);
for (var i = 0; i < playCounter; i++) {
clipArray.push(2);
}
clipArray.push(3);

$video2[0].load();
$video3[0].load();

$video1[0].play();
});

function drawImage(video) {
//last 2 params are video width and height
ctx.drawImage(video, 0, 0, 640, 360);
}

// copy the 1st video frame to canvas as soon as it is loaded
$video1.one("loadeddata", function() {
drawImage($video1[0]);
});

// copy video frame to canvas every 30 milliseconds
$video1.on("play", function() {
timerID = window.setInterval(function() {
drawImage($video1[0]);
}, 30);
});
$video2.on("play", function() {
timerID = window.setInterval(function() {
drawImage($video2[0]);
}, 30);
});
$video3.on("play", function() {
timerID = window.setInterval(function() {
drawImage($video3[0]);
}, 30);
});

function onVideoEnd() {
//stop copying frames to canvas for the current video element
stopTimer();

// remove 1st element of the array
clipArray.shift();

//IE fix
if (!this.paused) this.pause();

if (clipArray.length > 0) {
if (clipArray[0] === 1) {
$video1[0].play();
}
if (clipArray[0] === 2) {
$video2[0].play();
}
if (clipArray[0] === 3) {
$video3[0].play();
}
} else {
// in case of last video, make sure to load 1st video so that it would start from the 1st frame
$video1[0].load();
}
}

$video1.on("ended", onVideoEnd);
$video2.on("ended", onVideoEnd);
$video3.on("ended", onVideoEnd);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<div id="border">
<video id="video1" width="640" height="360" hidden>
<source type="video/mp4">
Your browser does not support playing this Video
</video>
<video id="video2" width="640" height="360" hidden>
<source type="video/mp4">
Your browser does not support playing this Video
</video>
<video id="video3" width="640" height="360" hidden>
<source type="video/mp4">
Your browser does not support playing this Video
</video>
<div>
<canvas id="myCanvas" width="640" height="360" />
</div>
<div role="controls">
<div>
<label>
Times the middle video will repeat itself:
</label>
</div>
<div>
<input id="playbackNum" value="1" />
</div>
<p>
<button id="startPlayback">Start</button>
</p>
</div>
</div>





Please note, the code is not very pretty and would benefit from some cleanup and optimization, but at least this should show the way to work around the problem and implement a seamless playback of several videos in HTML5.
Also make sure to include jQuery source file in html file location for the code to work.






share|improve this answer





















  • 4





    Do you have a URL where we can see this in action?

    – Zade
    Jan 23 '17 at 2:54











  • I created a video player with all the common controls in native JS based on this answer.

    – totymedli
    Jul 5 '18 at 19:58



















0














I have used VideoJS for some time and it allows seamless video playing.



http://videojs.com



You will be required jQuery for this. There are many other jQuery video players.






share|improve this answer
























  • Hi, thank you for the answer, but have you actually tried this yourself? I've seen a couple VideoJS answers that still haven't solved this. Also, if you know how to solve this with VideoJS, can you point me in a specific direction? As I know nothing about VideoJS.

    – Tanuki
    Dec 4 '15 at 21:42











  • Yes, I have worked with videoJS playlists. an example I have bookmarked is this github.com/jgallen23/videojs-playLists/blob/master/example/… there is also a playlist plugin for video js github.com/brightcove/videojs-playlist

    – miqdadamirali
    Dec 4 '15 at 21:52











  • Ok, the 1st one doesn't work out of the box. I've removed poster images code and replaced online videos with my own links, but there still is a quick flicker (of loading animation mind you) in between the videos. It might be because of poster images, but I am very averse to the idea of having to create and load a picture of every video I want to play. Guess I will have to dig down deeper into this to see if that is possible in VideoJS at all. Still, thank you for the link, perhaps I will find the light at the end of this tunnel.

    – Tanuki
    Dec 4 '15 at 22:16














Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f34097834%2fhtml5-video-how-to-do-a-seamless-play-and-or-loop-of-several-videos%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























2 Answers
2






active

oldest

votes








2 Answers
2






active

oldest

votes









active

oldest

votes






active

oldest

votes









5














After trying various things I have finally been able to create what seems to be a working solution. I haven't tested this on older browsers or other OSes, but this works on latest versions of Chrome, IE, Firefox and Opera. (Although some more feedback of whether this works on other systems would be appreciated)



The idea is to have all 3 videos output frames to HTML5 canvas. The original videos are hidden and preloaded in advance to avoid pause between loading.



Here is the code:






var playCounter = 0;
var clipArray = ;

var $video1 = $("#video1");
var $video2 = $("#video2");
var $video3 = $("#video3");

$video1.attr("src", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4");
$video2.attr("src", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerJoyrides.mp4");
$video3.attr("src", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerFun.mp4");

var timerID;

var $canvas = $("#myCanvas");
var ctx = $canvas[0].getContext("2d");

function stopTimer() {
window.clearInterval(timerID);
}

$('#startPlayback').click(function() {
stopTimer();
playCounter = $('#playbackNum').val();
clipArray = ;

// addd element to the end of the array
clipArray.push(1);
for (var i = 0; i < playCounter; i++) {
clipArray.push(2);
}
clipArray.push(3);

$video2[0].load();
$video3[0].load();

$video1[0].play();
});

function drawImage(video) {
//last 2 params are video width and height
ctx.drawImage(video, 0, 0, 640, 360);
}

// copy the 1st video frame to canvas as soon as it is loaded
$video1.one("loadeddata", function() {
drawImage($video1[0]);
});

// copy video frame to canvas every 30 milliseconds
$video1.on("play", function() {
timerID = window.setInterval(function() {
drawImage($video1[0]);
}, 30);
});
$video2.on("play", function() {
timerID = window.setInterval(function() {
drawImage($video2[0]);
}, 30);
});
$video3.on("play", function() {
timerID = window.setInterval(function() {
drawImage($video3[0]);
}, 30);
});

function onVideoEnd() {
//stop copying frames to canvas for the current video element
stopTimer();

// remove 1st element of the array
clipArray.shift();

//IE fix
if (!this.paused) this.pause();

if (clipArray.length > 0) {
if (clipArray[0] === 1) {
$video1[0].play();
}
if (clipArray[0] === 2) {
$video2[0].play();
}
if (clipArray[0] === 3) {
$video3[0].play();
}
} else {
// in case of last video, make sure to load 1st video so that it would start from the 1st frame
$video1[0].load();
}
}

$video1.on("ended", onVideoEnd);
$video2.on("ended", onVideoEnd);
$video3.on("ended", onVideoEnd);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<div id="border">
<video id="video1" width="640" height="360" hidden>
<source type="video/mp4">
Your browser does not support playing this Video
</video>
<video id="video2" width="640" height="360" hidden>
<source type="video/mp4">
Your browser does not support playing this Video
</video>
<video id="video3" width="640" height="360" hidden>
<source type="video/mp4">
Your browser does not support playing this Video
</video>
<div>
<canvas id="myCanvas" width="640" height="360" />
</div>
<div role="controls">
<div>
<label>
Times the middle video will repeat itself:
</label>
</div>
<div>
<input id="playbackNum" value="1" />
</div>
<p>
<button id="startPlayback">Start</button>
</p>
</div>
</div>





Please note, the code is not very pretty and would benefit from some cleanup and optimization, but at least this should show the way to work around the problem and implement a seamless playback of several videos in HTML5.
Also make sure to include jQuery source file in html file location for the code to work.






share|improve this answer





















  • 4





    Do you have a URL where we can see this in action?

    – Zade
    Jan 23 '17 at 2:54











  • I created a video player with all the common controls in native JS based on this answer.

    – totymedli
    Jul 5 '18 at 19:58
















5














After trying various things I have finally been able to create what seems to be a working solution. I haven't tested this on older browsers or other OSes, but this works on latest versions of Chrome, IE, Firefox and Opera. (Although some more feedback of whether this works on other systems would be appreciated)



The idea is to have all 3 videos output frames to HTML5 canvas. The original videos are hidden and preloaded in advance to avoid pause between loading.



Here is the code:






var playCounter = 0;
var clipArray = ;

var $video1 = $("#video1");
var $video2 = $("#video2");
var $video3 = $("#video3");

$video1.attr("src", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4");
$video2.attr("src", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerJoyrides.mp4");
$video3.attr("src", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerFun.mp4");

var timerID;

var $canvas = $("#myCanvas");
var ctx = $canvas[0].getContext("2d");

function stopTimer() {
window.clearInterval(timerID);
}

$('#startPlayback').click(function() {
stopTimer();
playCounter = $('#playbackNum').val();
clipArray = ;

// addd element to the end of the array
clipArray.push(1);
for (var i = 0; i < playCounter; i++) {
clipArray.push(2);
}
clipArray.push(3);

$video2[0].load();
$video3[0].load();

$video1[0].play();
});

function drawImage(video) {
//last 2 params are video width and height
ctx.drawImage(video, 0, 0, 640, 360);
}

// copy the 1st video frame to canvas as soon as it is loaded
$video1.one("loadeddata", function() {
drawImage($video1[0]);
});

// copy video frame to canvas every 30 milliseconds
$video1.on("play", function() {
timerID = window.setInterval(function() {
drawImage($video1[0]);
}, 30);
});
$video2.on("play", function() {
timerID = window.setInterval(function() {
drawImage($video2[0]);
}, 30);
});
$video3.on("play", function() {
timerID = window.setInterval(function() {
drawImage($video3[0]);
}, 30);
});

function onVideoEnd() {
//stop copying frames to canvas for the current video element
stopTimer();

// remove 1st element of the array
clipArray.shift();

//IE fix
if (!this.paused) this.pause();

if (clipArray.length > 0) {
if (clipArray[0] === 1) {
$video1[0].play();
}
if (clipArray[0] === 2) {
$video2[0].play();
}
if (clipArray[0] === 3) {
$video3[0].play();
}
} else {
// in case of last video, make sure to load 1st video so that it would start from the 1st frame
$video1[0].load();
}
}

$video1.on("ended", onVideoEnd);
$video2.on("ended", onVideoEnd);
$video3.on("ended", onVideoEnd);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<div id="border">
<video id="video1" width="640" height="360" hidden>
<source type="video/mp4">
Your browser does not support playing this Video
</video>
<video id="video2" width="640" height="360" hidden>
<source type="video/mp4">
Your browser does not support playing this Video
</video>
<video id="video3" width="640" height="360" hidden>
<source type="video/mp4">
Your browser does not support playing this Video
</video>
<div>
<canvas id="myCanvas" width="640" height="360" />
</div>
<div role="controls">
<div>
<label>
Times the middle video will repeat itself:
</label>
</div>
<div>
<input id="playbackNum" value="1" />
</div>
<p>
<button id="startPlayback">Start</button>
</p>
</div>
</div>





Please note, the code is not very pretty and would benefit from some cleanup and optimization, but at least this should show the way to work around the problem and implement a seamless playback of several videos in HTML5.
Also make sure to include jQuery source file in html file location for the code to work.






share|improve this answer





















  • 4





    Do you have a URL where we can see this in action?

    – Zade
    Jan 23 '17 at 2:54











  • I created a video player with all the common controls in native JS based on this answer.

    – totymedli
    Jul 5 '18 at 19:58














5












5








5







After trying various things I have finally been able to create what seems to be a working solution. I haven't tested this on older browsers or other OSes, but this works on latest versions of Chrome, IE, Firefox and Opera. (Although some more feedback of whether this works on other systems would be appreciated)



The idea is to have all 3 videos output frames to HTML5 canvas. The original videos are hidden and preloaded in advance to avoid pause between loading.



Here is the code:






var playCounter = 0;
var clipArray = ;

var $video1 = $("#video1");
var $video2 = $("#video2");
var $video3 = $("#video3");

$video1.attr("src", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4");
$video2.attr("src", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerJoyrides.mp4");
$video3.attr("src", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerFun.mp4");

var timerID;

var $canvas = $("#myCanvas");
var ctx = $canvas[0].getContext("2d");

function stopTimer() {
window.clearInterval(timerID);
}

$('#startPlayback').click(function() {
stopTimer();
playCounter = $('#playbackNum').val();
clipArray = ;

// addd element to the end of the array
clipArray.push(1);
for (var i = 0; i < playCounter; i++) {
clipArray.push(2);
}
clipArray.push(3);

$video2[0].load();
$video3[0].load();

$video1[0].play();
});

function drawImage(video) {
//last 2 params are video width and height
ctx.drawImage(video, 0, 0, 640, 360);
}

// copy the 1st video frame to canvas as soon as it is loaded
$video1.one("loadeddata", function() {
drawImage($video1[0]);
});

// copy video frame to canvas every 30 milliseconds
$video1.on("play", function() {
timerID = window.setInterval(function() {
drawImage($video1[0]);
}, 30);
});
$video2.on("play", function() {
timerID = window.setInterval(function() {
drawImage($video2[0]);
}, 30);
});
$video3.on("play", function() {
timerID = window.setInterval(function() {
drawImage($video3[0]);
}, 30);
});

function onVideoEnd() {
//stop copying frames to canvas for the current video element
stopTimer();

// remove 1st element of the array
clipArray.shift();

//IE fix
if (!this.paused) this.pause();

if (clipArray.length > 0) {
if (clipArray[0] === 1) {
$video1[0].play();
}
if (clipArray[0] === 2) {
$video2[0].play();
}
if (clipArray[0] === 3) {
$video3[0].play();
}
} else {
// in case of last video, make sure to load 1st video so that it would start from the 1st frame
$video1[0].load();
}
}

$video1.on("ended", onVideoEnd);
$video2.on("ended", onVideoEnd);
$video3.on("ended", onVideoEnd);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<div id="border">
<video id="video1" width="640" height="360" hidden>
<source type="video/mp4">
Your browser does not support playing this Video
</video>
<video id="video2" width="640" height="360" hidden>
<source type="video/mp4">
Your browser does not support playing this Video
</video>
<video id="video3" width="640" height="360" hidden>
<source type="video/mp4">
Your browser does not support playing this Video
</video>
<div>
<canvas id="myCanvas" width="640" height="360" />
</div>
<div role="controls">
<div>
<label>
Times the middle video will repeat itself:
</label>
</div>
<div>
<input id="playbackNum" value="1" />
</div>
<p>
<button id="startPlayback">Start</button>
</p>
</div>
</div>





Please note, the code is not very pretty and would benefit from some cleanup and optimization, but at least this should show the way to work around the problem and implement a seamless playback of several videos in HTML5.
Also make sure to include jQuery source file in html file location for the code to work.






share|improve this answer















After trying various things I have finally been able to create what seems to be a working solution. I haven't tested this on older browsers or other OSes, but this works on latest versions of Chrome, IE, Firefox and Opera. (Although some more feedback of whether this works on other systems would be appreciated)



The idea is to have all 3 videos output frames to HTML5 canvas. The original videos are hidden and preloaded in advance to avoid pause between loading.



Here is the code:






var playCounter = 0;
var clipArray = ;

var $video1 = $("#video1");
var $video2 = $("#video2");
var $video3 = $("#video3");

$video1.attr("src", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4");
$video2.attr("src", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerJoyrides.mp4");
$video3.attr("src", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerFun.mp4");

var timerID;

var $canvas = $("#myCanvas");
var ctx = $canvas[0].getContext("2d");

function stopTimer() {
window.clearInterval(timerID);
}

$('#startPlayback').click(function() {
stopTimer();
playCounter = $('#playbackNum').val();
clipArray = ;

// addd element to the end of the array
clipArray.push(1);
for (var i = 0; i < playCounter; i++) {
clipArray.push(2);
}
clipArray.push(3);

$video2[0].load();
$video3[0].load();

$video1[0].play();
});

function drawImage(video) {
//last 2 params are video width and height
ctx.drawImage(video, 0, 0, 640, 360);
}

// copy the 1st video frame to canvas as soon as it is loaded
$video1.one("loadeddata", function() {
drawImage($video1[0]);
});

// copy video frame to canvas every 30 milliseconds
$video1.on("play", function() {
timerID = window.setInterval(function() {
drawImage($video1[0]);
}, 30);
});
$video2.on("play", function() {
timerID = window.setInterval(function() {
drawImage($video2[0]);
}, 30);
});
$video3.on("play", function() {
timerID = window.setInterval(function() {
drawImage($video3[0]);
}, 30);
});

function onVideoEnd() {
//stop copying frames to canvas for the current video element
stopTimer();

// remove 1st element of the array
clipArray.shift();

//IE fix
if (!this.paused) this.pause();

if (clipArray.length > 0) {
if (clipArray[0] === 1) {
$video1[0].play();
}
if (clipArray[0] === 2) {
$video2[0].play();
}
if (clipArray[0] === 3) {
$video3[0].play();
}
} else {
// in case of last video, make sure to load 1st video so that it would start from the 1st frame
$video1[0].load();
}
}

$video1.on("ended", onVideoEnd);
$video2.on("ended", onVideoEnd);
$video3.on("ended", onVideoEnd);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<div id="border">
<video id="video1" width="640" height="360" hidden>
<source type="video/mp4">
Your browser does not support playing this Video
</video>
<video id="video2" width="640" height="360" hidden>
<source type="video/mp4">
Your browser does not support playing this Video
</video>
<video id="video3" width="640" height="360" hidden>
<source type="video/mp4">
Your browser does not support playing this Video
</video>
<div>
<canvas id="myCanvas" width="640" height="360" />
</div>
<div role="controls">
<div>
<label>
Times the middle video will repeat itself:
</label>
</div>
<div>
<input id="playbackNum" value="1" />
</div>
<p>
<button id="startPlayback">Start</button>
</p>
</div>
</div>





Please note, the code is not very pretty and would benefit from some cleanup and optimization, but at least this should show the way to work around the problem and implement a seamless playback of several videos in HTML5.
Also make sure to include jQuery source file in html file location for the code to work.






var playCounter = 0;
var clipArray = ;

var $video1 = $("#video1");
var $video2 = $("#video2");
var $video3 = $("#video3");

$video1.attr("src", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4");
$video2.attr("src", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerJoyrides.mp4");
$video3.attr("src", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerFun.mp4");

var timerID;

var $canvas = $("#myCanvas");
var ctx = $canvas[0].getContext("2d");

function stopTimer() {
window.clearInterval(timerID);
}

$('#startPlayback').click(function() {
stopTimer();
playCounter = $('#playbackNum').val();
clipArray = ;

// addd element to the end of the array
clipArray.push(1);
for (var i = 0; i < playCounter; i++) {
clipArray.push(2);
}
clipArray.push(3);

$video2[0].load();
$video3[0].load();

$video1[0].play();
});

function drawImage(video) {
//last 2 params are video width and height
ctx.drawImage(video, 0, 0, 640, 360);
}

// copy the 1st video frame to canvas as soon as it is loaded
$video1.one("loadeddata", function() {
drawImage($video1[0]);
});

// copy video frame to canvas every 30 milliseconds
$video1.on("play", function() {
timerID = window.setInterval(function() {
drawImage($video1[0]);
}, 30);
});
$video2.on("play", function() {
timerID = window.setInterval(function() {
drawImage($video2[0]);
}, 30);
});
$video3.on("play", function() {
timerID = window.setInterval(function() {
drawImage($video3[0]);
}, 30);
});

function onVideoEnd() {
//stop copying frames to canvas for the current video element
stopTimer();

// remove 1st element of the array
clipArray.shift();

//IE fix
if (!this.paused) this.pause();

if (clipArray.length > 0) {
if (clipArray[0] === 1) {
$video1[0].play();
}
if (clipArray[0] === 2) {
$video2[0].play();
}
if (clipArray[0] === 3) {
$video3[0].play();
}
} else {
// in case of last video, make sure to load 1st video so that it would start from the 1st frame
$video1[0].load();
}
}

$video1.on("ended", onVideoEnd);
$video2.on("ended", onVideoEnd);
$video3.on("ended", onVideoEnd);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<div id="border">
<video id="video1" width="640" height="360" hidden>
<source type="video/mp4">
Your browser does not support playing this Video
</video>
<video id="video2" width="640" height="360" hidden>
<source type="video/mp4">
Your browser does not support playing this Video
</video>
<video id="video3" width="640" height="360" hidden>
<source type="video/mp4">
Your browser does not support playing this Video
</video>
<div>
<canvas id="myCanvas" width="640" height="360" />
</div>
<div role="controls">
<div>
<label>
Times the middle video will repeat itself:
</label>
</div>
<div>
<input id="playbackNum" value="1" />
</div>
<p>
<button id="startPlayback">Start</button>
</p>
</div>
</div>





var playCounter = 0;
var clipArray = ;

var $video1 = $("#video1");
var $video2 = $("#video2");
var $video3 = $("#video3");

$video1.attr("src", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4");
$video2.attr("src", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerJoyrides.mp4");
$video3.attr("src", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerFun.mp4");

var timerID;

var $canvas = $("#myCanvas");
var ctx = $canvas[0].getContext("2d");

function stopTimer() {
window.clearInterval(timerID);
}

$('#startPlayback').click(function() {
stopTimer();
playCounter = $('#playbackNum').val();
clipArray = ;

// addd element to the end of the array
clipArray.push(1);
for (var i = 0; i < playCounter; i++) {
clipArray.push(2);
}
clipArray.push(3);

$video2[0].load();
$video3[0].load();

$video1[0].play();
});

function drawImage(video) {
//last 2 params are video width and height
ctx.drawImage(video, 0, 0, 640, 360);
}

// copy the 1st video frame to canvas as soon as it is loaded
$video1.one("loadeddata", function() {
drawImage($video1[0]);
});

// copy video frame to canvas every 30 milliseconds
$video1.on("play", function() {
timerID = window.setInterval(function() {
drawImage($video1[0]);
}, 30);
});
$video2.on("play", function() {
timerID = window.setInterval(function() {
drawImage($video2[0]);
}, 30);
});
$video3.on("play", function() {
timerID = window.setInterval(function() {
drawImage($video3[0]);
}, 30);
});

function onVideoEnd() {
//stop copying frames to canvas for the current video element
stopTimer();

// remove 1st element of the array
clipArray.shift();

//IE fix
if (!this.paused) this.pause();

if (clipArray.length > 0) {
if (clipArray[0] === 1) {
$video1[0].play();
}
if (clipArray[0] === 2) {
$video2[0].play();
}
if (clipArray[0] === 3) {
$video3[0].play();
}
} else {
// in case of last video, make sure to load 1st video so that it would start from the 1st frame
$video1[0].load();
}
}

$video1.on("ended", onVideoEnd);
$video2.on("ended", onVideoEnd);
$video3.on("ended", onVideoEnd);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<div id="border">
<video id="video1" width="640" height="360" hidden>
<source type="video/mp4">
Your browser does not support playing this Video
</video>
<video id="video2" width="640" height="360" hidden>
<source type="video/mp4">
Your browser does not support playing this Video
</video>
<video id="video3" width="640" height="360" hidden>
<source type="video/mp4">
Your browser does not support playing this Video
</video>
<div>
<canvas id="myCanvas" width="640" height="360" />
</div>
<div role="controls">
<div>
<label>
Times the middle video will repeat itself:
</label>
</div>
<div>
<input id="playbackNum" value="1" />
</div>
<p>
<button id="startPlayback">Start</button>
</p>
</div>
</div>






share|improve this answer














share|improve this answer



share|improve this answer








edited Jul 5 '18 at 9:14









totymedli

14k1378113




14k1378113










answered Dec 7 '15 at 15:50









TanukiTanuki

302416




302416








  • 4





    Do you have a URL where we can see this in action?

    – Zade
    Jan 23 '17 at 2:54











  • I created a video player with all the common controls in native JS based on this answer.

    – totymedli
    Jul 5 '18 at 19:58














  • 4





    Do you have a URL where we can see this in action?

    – Zade
    Jan 23 '17 at 2:54











  • I created a video player with all the common controls in native JS based on this answer.

    – totymedli
    Jul 5 '18 at 19:58








4




4





Do you have a URL where we can see this in action?

– Zade
Jan 23 '17 at 2:54





Do you have a URL where we can see this in action?

– Zade
Jan 23 '17 at 2:54













I created a video player with all the common controls in native JS based on this answer.

– totymedli
Jul 5 '18 at 19:58





I created a video player with all the common controls in native JS based on this answer.

– totymedli
Jul 5 '18 at 19:58













0














I have used VideoJS for some time and it allows seamless video playing.



http://videojs.com



You will be required jQuery for this. There are many other jQuery video players.






share|improve this answer
























  • Hi, thank you for the answer, but have you actually tried this yourself? I've seen a couple VideoJS answers that still haven't solved this. Also, if you know how to solve this with VideoJS, can you point me in a specific direction? As I know nothing about VideoJS.

    – Tanuki
    Dec 4 '15 at 21:42











  • Yes, I have worked with videoJS playlists. an example I have bookmarked is this github.com/jgallen23/videojs-playLists/blob/master/example/… there is also a playlist plugin for video js github.com/brightcove/videojs-playlist

    – miqdadamirali
    Dec 4 '15 at 21:52











  • Ok, the 1st one doesn't work out of the box. I've removed poster images code and replaced online videos with my own links, but there still is a quick flicker (of loading animation mind you) in between the videos. It might be because of poster images, but I am very averse to the idea of having to create and load a picture of every video I want to play. Guess I will have to dig down deeper into this to see if that is possible in VideoJS at all. Still, thank you for the link, perhaps I will find the light at the end of this tunnel.

    – Tanuki
    Dec 4 '15 at 22:16


















0














I have used VideoJS for some time and it allows seamless video playing.



http://videojs.com



You will be required jQuery for this. There are many other jQuery video players.






share|improve this answer
























  • Hi, thank you for the answer, but have you actually tried this yourself? I've seen a couple VideoJS answers that still haven't solved this. Also, if you know how to solve this with VideoJS, can you point me in a specific direction? As I know nothing about VideoJS.

    – Tanuki
    Dec 4 '15 at 21:42











  • Yes, I have worked with videoJS playlists. an example I have bookmarked is this github.com/jgallen23/videojs-playLists/blob/master/example/… there is also a playlist plugin for video js github.com/brightcove/videojs-playlist

    – miqdadamirali
    Dec 4 '15 at 21:52











  • Ok, the 1st one doesn't work out of the box. I've removed poster images code and replaced online videos with my own links, but there still is a quick flicker (of loading animation mind you) in between the videos. It might be because of poster images, but I am very averse to the idea of having to create and load a picture of every video I want to play. Guess I will have to dig down deeper into this to see if that is possible in VideoJS at all. Still, thank you for the link, perhaps I will find the light at the end of this tunnel.

    – Tanuki
    Dec 4 '15 at 22:16
















0












0








0







I have used VideoJS for some time and it allows seamless video playing.



http://videojs.com



You will be required jQuery for this. There are many other jQuery video players.






share|improve this answer













I have used VideoJS for some time and it allows seamless video playing.



http://videojs.com



You will be required jQuery for this. There are many other jQuery video players.







share|improve this answer












share|improve this answer



share|improve this answer










answered Dec 4 '15 at 21:37









miqdadamiralimiqdadamirali

1,5612828




1,5612828













  • Hi, thank you for the answer, but have you actually tried this yourself? I've seen a couple VideoJS answers that still haven't solved this. Also, if you know how to solve this with VideoJS, can you point me in a specific direction? As I know nothing about VideoJS.

    – Tanuki
    Dec 4 '15 at 21:42











  • Yes, I have worked with videoJS playlists. an example I have bookmarked is this github.com/jgallen23/videojs-playLists/blob/master/example/… there is also a playlist plugin for video js github.com/brightcove/videojs-playlist

    – miqdadamirali
    Dec 4 '15 at 21:52











  • Ok, the 1st one doesn't work out of the box. I've removed poster images code and replaced online videos with my own links, but there still is a quick flicker (of loading animation mind you) in between the videos. It might be because of poster images, but I am very averse to the idea of having to create and load a picture of every video I want to play. Guess I will have to dig down deeper into this to see if that is possible in VideoJS at all. Still, thank you for the link, perhaps I will find the light at the end of this tunnel.

    – Tanuki
    Dec 4 '15 at 22:16





















  • Hi, thank you for the answer, but have you actually tried this yourself? I've seen a couple VideoJS answers that still haven't solved this. Also, if you know how to solve this with VideoJS, can you point me in a specific direction? As I know nothing about VideoJS.

    – Tanuki
    Dec 4 '15 at 21:42











  • Yes, I have worked with videoJS playlists. an example I have bookmarked is this github.com/jgallen23/videojs-playLists/blob/master/example/… there is also a playlist plugin for video js github.com/brightcove/videojs-playlist

    – miqdadamirali
    Dec 4 '15 at 21:52











  • Ok, the 1st one doesn't work out of the box. I've removed poster images code and replaced online videos with my own links, but there still is a quick flicker (of loading animation mind you) in between the videos. It might be because of poster images, but I am very averse to the idea of having to create and load a picture of every video I want to play. Guess I will have to dig down deeper into this to see if that is possible in VideoJS at all. Still, thank you for the link, perhaps I will find the light at the end of this tunnel.

    – Tanuki
    Dec 4 '15 at 22:16



















Hi, thank you for the answer, but have you actually tried this yourself? I've seen a couple VideoJS answers that still haven't solved this. Also, if you know how to solve this with VideoJS, can you point me in a specific direction? As I know nothing about VideoJS.

– Tanuki
Dec 4 '15 at 21:42





Hi, thank you for the answer, but have you actually tried this yourself? I've seen a couple VideoJS answers that still haven't solved this. Also, if you know how to solve this with VideoJS, can you point me in a specific direction? As I know nothing about VideoJS.

– Tanuki
Dec 4 '15 at 21:42













Yes, I have worked with videoJS playlists. an example I have bookmarked is this github.com/jgallen23/videojs-playLists/blob/master/example/… there is also a playlist plugin for video js github.com/brightcove/videojs-playlist

– miqdadamirali
Dec 4 '15 at 21:52





Yes, I have worked with videoJS playlists. an example I have bookmarked is this github.com/jgallen23/videojs-playLists/blob/master/example/… there is also a playlist plugin for video js github.com/brightcove/videojs-playlist

– miqdadamirali
Dec 4 '15 at 21:52













Ok, the 1st one doesn't work out of the box. I've removed poster images code and replaced online videos with my own links, but there still is a quick flicker (of loading animation mind you) in between the videos. It might be because of poster images, but I am very averse to the idea of having to create and load a picture of every video I want to play. Guess I will have to dig down deeper into this to see if that is possible in VideoJS at all. Still, thank you for the link, perhaps I will find the light at the end of this tunnel.

– Tanuki
Dec 4 '15 at 22:16







Ok, the 1st one doesn't work out of the box. I've removed poster images code and replaced online videos with my own links, but there still is a quick flicker (of loading animation mind you) in between the videos. It might be because of poster images, but I am very averse to the idea of having to create and load a picture of every video I want to play. Guess I will have to dig down deeper into this to see if that is possible in VideoJS at all. Still, thank you for the link, perhaps I will find the light at the end of this tunnel.

– Tanuki
Dec 4 '15 at 22:16




















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f34097834%2fhtml5-video-how-to-do-a-seamless-play-and-or-loop-of-several-videos%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks

Calculate evaluation metrics using cross_val_predict sklearn

Insert data from modal to MySQL (multiple modal on website)