source: main/trunk/model-sites-dev/respooled/collect/popup-video-respooled/js/media-player.js@ 29867

Last change on this file since 29867 was 29867, checked in by davidb, 9 years ago

Next round of improvements. More open-close bars. Drums with better images. Drums played on mousedown + key mappings. Playbar layout changed. Timing info when playing added.

File size: 7.4 KB
Line 
1// Sample Media Player using HTML5's Media API
2//
3// Ian Devlin (c) 2012
4// http://iandevlin.com
5// http://twitter.com/iandevlin
6//
7// This was written as part of an article for the February 2013 edition of .net magazine (http://netmagazine.com/)
8
9// Wait for the DOM to be loaded before initialising the media player
10document.addEventListener("DOMContentLoaded", function() { initialiseMediaPlayer(); }, false);
11
12// Variables to store handles to various required elements
13var mediaPlayer;
14var playPauseBtn;
15var muteBtn;
16var progressBar;
17
18var mediaStartPlayTime;
19var mediaStartPauseTime;
20var mediaPlayedNotes;
21
22function initialiseMediaPlayer() {
23
24 mediaStartPlayTime = null;
25 mediaStartPauseTime = null;
26 mediaPlayedNotes = {};
27
28 // Get a handle to the player
29 mediaPlayer = document.getElementById('video');
30
31 // Get handles to each of the buttons and required elements
32 playPauseBtn = document.getElementById('play-pause-button');
33 muteBtn = document.getElementById('mute-button');
34 progressBar = document.getElementById('progress-bar');
35
36 // Hide the browser's default controls
37 mediaPlayer.controls = false;
38
39 // Add a listener for the timeupdate event so we can update the progress bar
40 mediaPlayer.addEventListener('timeupdate', updateProgressBar, false);
41
42 // Add a listener so the video can be advanced if the progress bar is clicked on
43 progressBar.addEventListener("change", progressBarChanged);
44
45
46 // Pause the video when the slider handle is being dragged
47 progressBar.addEventListener("mousedown", function() {
48 mediaPlayer.pause();
49 });
50
51 // Play the video when the slider handle is dropped
52 progressBar.addEventListener("mouseup", function() {
53 mediaPlayer.play();
54 });
55
56 // Add a listener for the play and pause events so the buttons state can be updated
57 mediaPlayer.addEventListener('play', function() {
58 // Change the button to be a pause button
59 changeButtonType(playPauseBtn, 'buttonx2 pause');
60 }, false);
61 mediaPlayer.addEventListener('pause', function() {
62 // Change the button to be a play button
63 changeButtonType(playPauseBtn, 'buttonx2 play');
64 }, false);
65
66 // need to work on this one more...how to know it's muted?
67 mediaPlayer.addEventListener('volumechange', function(e) {
68 // Update the button to be mute/unmute
69 if (mediaPlayer.muted) changeButtonType(muteBtn, 'button unmute');
70 else changeButtonType(muteBtn, 'button mute');
71 }, false);
72 mediaPlayer.addEventListener('ended', function() { this.pause(); }, false);
73}
74
75function togglePlayPause() {
76 // If the mediaPlayer is currently paused or has ended
77 if (mediaPlayer.paused || mediaPlayer.ended) {
78 if (mediaStartPlayTime == null) {
79 mediaStartPlayTime = Date.now();
80 //console.log("*** mediaStartPlayTime=" + mediaStartPlayTime);
81 mediaPlayedNotes[String(mediaStartPlayTime)] = [];
82
83 }
84 else {
85 var mediaPauseBuildup = mediaStartPauseTime - Date.now();
86
87 // adjust the start play time to the pause is effectively ignored
88 mediaStartPlayTime += mediaPauseBuildup;
89 mediaStartPauseTime = null;
90
91 }
92
93 // Change the button to be a pause button
94 changeButtonType(playPauseBtn, 'buttonx2 pause');
95 // Play the media
96 mediaPlayer.play();
97 }
98 // Otherwise it must currently be playing
99 else {
100 mediaPauseTime = Date.now();
101
102 // Change the button to be a play button
103 changeButtonType(playPauseBtn, 'buttonx2 play');
104 // Pause the media
105 mediaPlayer.pause();
106
107 console.log("*** mediaPlayedNotes = " + JSON.stringify(mediaPlayedNotes));
108 }
109}
110
111function pad(n, width, z) {
112 z = z || '0';
113 n = n + '';
114 return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
115}
116
117function convertSecsToTimeStr(time)
118{
119 var int_mins = Math.floor(time / 60);
120
121 var float_secs = time % 60;
122 //var int_secs = Math.floor(float_secs);
123
124 //var float_sub_sec = float_secs - int_secs;
125 //var int_sub_sec = float_sub_sec.toFixed(2)
126
127 var padded_secs = pad(float_secs.toFixed(1),4); // (2), 5 for 2 dec place
128 return int_mins + ":" + padded_secs
129}
130
131
132function displayCurrentTime()
133{
134 var currentTime = mediaPlayer.currentTime;
135 var formattedTime = convertSecsToTimeStr(currentTime);
136 $('#mediaPlayerCurrentTime').html(formattedTime);
137}
138
139function displayDuration(duration)
140{
141 var formattedTime = convertSecsToTimeStr(duration);
142 $('#mediaPlayerTotalTime').html(formattedTime);
143}
144
145
146// Stop the current media from playing, and return it to the start position
147function stopPlayer()
148{
149 mediaPlayer.pause();
150 mediaPlayer.currentTime = 0;
151 displayCurrentTime();
152}
153
154// Changes the volume on the media player
155function changeVolume(direction) {
156 if (direction === '+') mediaPlayer.volume += mediaPlayer.volume == 1 ? 0 : 0.1;
157 else mediaPlayer.volume -= (mediaPlayer.volume == 0 ? 0 : 0.1);
158 mediaPlayer.volume = parseFloat(mediaPlayer.volume).toFixed(1);
159}
160
161// Toggles the media player's mute and unmute status
162function toggleMute() {
163 if (mediaPlayer.muted) {
164 // Change the cutton to be a mute button
165 changeButtonType(muteBtn, 'button mute');
166 // Unmute the media player
167 mediaPlayer.muted = false;
168 }
169 else {
170 // Change the button to be an unmute button
171 changeButtonType(muteBtn, 'button unmute');
172 // Mute the media player
173 mediaPlayer.muted = true;
174 }
175}
176
177// Replays the media currently loaded in the player
178function replayMedia() {
179 resetPlayer();
180 mediaPlayer.play();
181}
182
183// Update the progress bar
184function updateProgressBar() {
185 // Work out how much of the media has played via the duration and currentTime parameters
186 var percentage = (100 / mediaPlayer.duration) * mediaPlayer.currentTime;
187
188 // Update the progress bar's value
189 progressBar.value = percentage;
190
191 // Update the progress bar's text (for browsers that don't support the progress element)
192 progressBar.innerHTML = Math.floor(percentage) + '% played';
193
194 displayCurrentTime();
195}
196
197function progressBarChanged() {
198 //console.log("**** progress bar changed!")
199 // Calculate the new time
200 var time = mediaPlayer.duration * (progressBar.value / 100);
201
202 // Update the video time
203 mediaPlayer.currentTime = time;
204 displayCurrentTime();
205}
206
207// Updates a button's title, innerHTML and CSS class to a certain value
208function changeButtonType(btn, value) {
209 btn.title = value;
210 btn.innerHTML = value;
211 btn.className = value;
212}
213
214// Loads a video item into the media player
215function loadVideo() {
216 for (var i = 0; i < arguments.length; i++) {
217 var file = arguments[i].split('.');
218 var ext = file[file.length - 1];
219 // Check if this media can be played
220 if (canPlayVideo(ext)) {
221 // Reset the player, change the source file and load it
222 resetPlayer();
223 mediaPlayer.src = arguments[i];
224 mediaPlayer.load();
225 break;
226 }
227 }
228}
229
230// Checks if the browser can play this particular type of file or not
231function canPlayVideo(ext) {
232 var ableToPlay = mediaPlayer.canPlayType('video/' + ext);
233 if (ableToPlay == '') return false;
234 else return true;
235}
236
237// Resets the media player
238function resetPlayer() {
239 mediaStartPlayTime = null;
240 mediaStartPauseTime = null;
241
242 // Reset the progress bar to 0
243 progressBar.value = 0;
244 // Move the media back to the start
245 mediaPlayer.currentTime = 0;
246 displayCurrentTime();
247 // Ensure that the play pause button is set as 'play'
248 changeButtonType(playPauseBtn, 'play');
249}
Note: See TracBrowser for help on using the repository browser.