<html lang="en">
<head>
<title>Example of track modes</title>
</head>
<body onload="init();">
<p style="text-align: left;">This setup contains a video encoded in both <a href="http://demo.jwplayer.com/html5-report/sintel.webm">WebM</a> and <a href="http://demo.jwplayer.com/html5-report/sintel.mp4">MP4</a>. The video contains four tracks:</p>
<p>
<video id="myVideo" preload="metadata" poster ="http://mainline.i3s.unice.fr/mooc/sintel.jpg" crossorigin="anonymous" controls="controls" width="640" height="272">
<source src="https://mainline.i3s.unice.fr/mooc/sintel.mp4" type="video/mp4" />
<source src="https://mainline.i3s.unice.fr/mooc/sintel.webm" type="video/webm" />
<track src="https://mainline.i3s.unice.fr/mooc/sintel-captions.vtt" kind="captions" label="English Captions" default/>
<track src="https://mainline.i3s.unice.fr/mooc/sintel-descriptions.vtt" kind="descriptions" label="Audio Descriptions" />
<track src="https://mainline.i3s.unice.fr/mooc/sintel-chapters.vtt" kind="chapters" label="Chapter Markers" />
<track src="https://mainline.i3s.unice.fr/mooc/sintel-thumbs.vtt" kind="metadata" label="Preview Thumbs" /></video></p>
<div id="currentTrackStatuses"></div><p>
<div id="subtitlesCaptions"></div><p>
<button onclick="clearSubtitlesCaptions();">Clear subtitles/captions log</button></p>
<p>Click one of these buttons to toggle the mode of each track:</p>
<button onclick="toggleTrack(0);">Toggle english caption track mode</button><br>
<button onclick="toggleTrack(1);">Toggle audio description track mode</button><br>
<button onclick="toggleTrack(2);">Toggle chapter track mode</button><br>
<button onclick="toggleTrack(3);">Toggle preview thumbnail track modes</button>
</body>
</html>
var tracks, video, statusDiv, subtitlesCaptionsDiv;
function init() {
video = document.querySelector("#myVideo");
statusDiv = document.querySelector("#currentTrackStatuses");
subtitlesCaptionsDiv = document.querySelector("#subtitlesCaptions");
//tracks = video.textTracks;
tracks = document.querySelectorAll("track");
video.addEventListener('loadedmetadata', function() {
console.log("metadata loaded");
// define cue listeners for the tracks
for(var i=0; i<tracks.length; i++) {
var t = tracks[i].track;
if(t.mode === "showing") {
t.addEventListener('cuechange', logCue, false);
}
}
// fill the log
displayTrackStatus();
});
}
function displayTrackStatus() {
for(var i=0; i<tracks.length; i++) {
var t = tracks[i].track;
var mode = t.mode;
if(mode === "disabled") {
mode = "<span style='color:red'>" + t.mode + "</span>";
} else if(mode === "showing") {
mode = "<span style='color:green'>" + t.mode + "</span>";
}
appendToScrollableDiv(statusDiv, "track "+i+": " + t.label + " "+t.kind+" in "+mode+" mode");
}
}
function appendToScrollableDiv(div, text) {
var inner = div.innerHTML;
div.innerHTML = inner + text + "<br/>";
div.scrollTop = div.scrollHeight;
}
function clearDiv(div) {
div.innerHTML = '';
}
function clearSubtitlesCaptions() {
clearDiv(subtitlesCaptionsDiv);
}
function toggleTrack(i) {
var t = tracks[i].track;
switch (t.mode) {
case "disabled":
t.addEventListener('cuechange', logCue, false);
t.mode = "hidden";
break;
case "hidden":
t.mode = "showing";
break;
case "showing":
t.removeEventListener('cuechange', logCue, false);
t.mode = "disabled";
break;
}
clearDiv(statusDiv);
displayTrackStatus();
appendToScrollableDiv(statusDiv,"<br>" + t.label+" are now " +t.mode);
}
function logCue() {
console.log("log cues");
if(this.activeCues && this.activeCues.length) {
var t = this.activeCues[0].text;
appendToScrollableDiv(subtitlesCaptionsDiv, "Active "+this.kind+" changed to: "+t);
}
}
Output
300px
You can jump to the latest bin by adding /latest
to your URL
Keyboard Shortcuts
Shortcut | Action |
---|---|
ctrl + [num] | Toggle nth panel |
ctrl + 0 | Close focused panel |
ctrl + enter | Re-render output. If console visible: run JS in console |
Ctrl + l | Clear the console |
ctrl + / | Toggle comment on selected lines |
ctrl + ] | Indents selected lines |
ctrl + [ | Unindents selected lines |
tab | Code complete & Emmet expand |
ctrl + shift + L | Beautify code in active panel |
ctrl + s | Save & lock current Bin from further changes |
ctrl + shift + s | Open the share options |
ctrl + y | Archive Bin |
Complete list of JS Bin shortcuts |
JS Bin URLs
URL | Action |
---|---|
/ | Show the full rendered output. This content will update in real time as it's updated from the /edit url. |
/edit | Edit the current bin |
/watch | Follow a Code Casting session |
/embed | Create an embeddable version of the bin |
/latest | Load the very latest bin (/latest goes in place of the revision) |
/[username]/last | View the last edited bin for this user |
/[username]/last/edit | Edit the last edited bin for this user |
/[username]/last/watch | Follow the Code Casting session for the latest bin for this user |
/quiet | Remove analytics and edit button from rendered output |
.js | Load only the JavaScript for a bin |
.css | Load only the CSS for a bin |
Except for username prefixed urls, the url may start with http://jsbin.com/abc and the url fragments can be added to the url to view it differently. |