Вместе с новыми элементами audio и video в HTML5 был добавлен новый API в JavaScript для управления этими элементами. С помощью кода JavaScript мы можем получить элементы video и audio (как и любой другой элемент) и использовать их свойства. В JavaScript эти элементы представлены объектом HTMLMediaElement, который с помощью свойств, методов и событий позволяет управлять воспроизведением аудио и видео. Отметим наиболее важные свойства, которые могут нам пригодиться для настройки этих элементов:
playbackRate: устанавливает скорость воспроизведения. По умолчанию равно 1
src: возвращает название воспроизводимого ресурса, если он установлен в коде html элемента
duration: возвращает длительность файла в секундах
buffered: возвращает длительность той части файла, которая уже буферизирована и готова к воспроизведению
controls: устанавливает или возвращает наличие атрибута controls
. Если он установлен, возвращается true
, иначе возвращает false
loop: устанавливает или возвращает наличие атрибута loop
. Если он установлен, возвращается true
, иначе возвращает false
muted: устанавливает или возвращает наличие атрибута muted
preload: устанавливает или возвращает наличие атрибута preload
volume: устанавливает или возвращает уровень звука от 0.0 до 1.0
currentTime: возвращает текущее время воспроизведения
Отдельно для элемента video
мы можем использовать ряд дополнительных свойств:
poster: устанавливает или возвращает атрибут poster
height: устанавливает или возвращает атрибут height
width: устанавливает или возвращает атрибут width
videoWidth, videoHeight: для элемента video возвращают ширину и высоту видео
Следует также отметить два метода, с помощью которых мы можем управлять воспроизведением:
play(): начинает воспроизведение
pause(): приостанавливает воспроизведение
Основные события элементов video и audio:
canplaythrough: это событие срабатывает после загрузки страницы, если браузер определит, что он может воспроизводить это видео/аудио
pause: событие срабатывает, когда воспроизведение мультимедиа приостанавливается, и оно переводится в состояние "paused"
play: событие срабатывает, когда начинается воспроизведение файла
volumechange: срабатывает при изменении уровня звука мультимедиа
ended: срабатывает при окончании воспроизведения
timeupdate: срабатывает при изменении времени воспроизведения
error: генерируется при возникновении ошибки
loadeddata: срабатывает, когда будет загружен первый фрейм видеофайла
loadedmetadata: срабатывает после загрузки метаданных мультимедиа (длительность воспроизведения, размеры видео и т.д.)
seeking: срабатывает, когда пользователь начинает перемещать курсор по шкале воспроизведения для перемещения к новому месту аудио- или видеофайла
seeked: срабатывает, когда пользователь завершил перемещение к новому месту на шкале воспроизведения
Теперь используем некоторые из этих свойств, событий и методов для управления элементом video:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Аудио в HTML5</title> <style> .hidden{ display:none; } #playBtn { border: solid 1px #333; padding: 5px; cursor: pointer; } </style> </head> <body> <video width="400" height="300"> <source src="cats.mp4" type="video/mp4"> <source src="cats.webm" type="video/webm"> <source src="cats.ogv" type="video/ogg"> </video> <div id="controls" class="hidden"> <a id="playBtn">Play</a> <span id="timer">00:00</span> <input type="range" step="0.1" min="0" max="1" value="0" id="volume" /> </div> <script> // получаем все элементы var videoEl = document.getElementsByTagName('video')[0], playBtn = document.getElementById('playBtn'), vidControls = document.getElementById('controls'), volumeControl = document.getElementById('volume'), timePicker = document.getElementById('timer'); // если браузер может воспроизводить видео удаляем класс videoEl.addEventListener('canplaythrough', function () { vidControls.classList.remove('hidden'); videoEl.volume = volumeControl.value; }, false); // запускам или останавливаем воспроизведение playBtn.addEventListener('click', function () { if (videoEl.paused) { videoEl.play(); } else { videoEl.pause(); } }, false); videoEl.addEventListener('play', function () { playBtn.innerText = "Pause"; }, false); videoEl.addEventListener('pause', function () { playBtn.innerText = "Play"; }, false); volumeControl.addEventListener('input', function () { videoEl.volume = volumeControl.value; }, false); videoEl.addEventListener('ended', function () { videoEl.currentTime = 0; }, false); videoEl.addEventListener('timeupdate', function () { timePicker.innerHTML = secondsToTime(videoEl.currentTime); }, false); // рассчет отображаемого времени function secondsToTime(time){ var h = Math.floor(time / (60 * 60)), dm = time % (60 * 60), m = Math.floor(dm / 60), ds = dm % 60, s = Math.ceil(ds); if (s === 60) { s = 0; m = m + 1; } if (s < 10) { s = '0' + s; } if (m === 60) { m = 0; h = h + 1; } if (m < 10) { m = '0' + m; } if (h === 0) { fulltime = m + ':' + s; } else { fulltime = h + ':' + m + ':' + s; } return fulltime; } </script> </body> </html>
Вначале в коде JavaScript мы получаем все элементы. Затем, если браузер поддерживает видео и может его воспроизвести, то обрабатываем событие
canplaythrough
, устанавливая уровень звука и удаляя класс hidden:
videoEl.addEventListener('canplaythrough', function () { vidControls.classList.remove('hidden'); videoEl.volume = volumeControl.value; }, false);
Чтобы запустить воспроизведение, нам надо обработать нажатие ссылки Play:
playBtn.addEventListener('click', function () { if (videoEl.paused) { // если видео остановлено, запускаем videoEl.play(); } else { videoEl.pause(); } }, false);
Обрабатывая события запуска и остановки воспроизведения, мы можем изменять надпись на ссылке:
videoEl.addEventListener('play', function () { playBtn.innerText = "Pause"; }, false); videoEl.addEventListener('pause', function () { playBtn.innerText = "Play"; }, false);
Обрабатывая событие input
, которое возникает при изменении значения ползунка, мы можем синхронизировать изменение ползунка и громкость
видео:
volumeControl.addEventListener('input', function () { videoEl.volume = volumeControl.value; }, false);
Обработка события ended
позволит сбросить время воспроизведения:
videoEl.addEventListener('ended', function () { videoEl.currentTime = 0; }, false);
А обработчик события timeupdate
позволит динамически изменять показатель времени воспроизведения:
videoEl.addEventListener('timeupdate', function () { timePicker.innerHTML = secondsToTime(videoEl.currentTime); }, false);
Для форматирования строки времени применяется вспомогательная функция secondsToTime
. В итоге мы получим следующие элементы
воспроизведения:
Ну и подобным образом можно добавить другие элементы, например, шкалу воспроизведения, какие-то другие кнопки.