Menu

Аудио в HTML: тег audio, controls, autoplay и loop

Элемент <audio> воспроизводит звуковые файлы встроенным плеером браузера. Разберем разметку, атрибуты (controls, autoplay, loop, muted, preload), какие форматы использовать, почему блокируется автовоспроизведение со звуком и как сделать свою кнопку воспроизведения на JavaScript.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Как вставить аудио

Укажите элементу <audio> звуковой файл и добавьте controls:

<audio src="song.mp3" controls></audio>

controls показывает плеер браузера: воспроизведение и пауза, шкала времени, время и регулятор громкости. Без controls элемент вообще не занимает места. Превью не может загружать файлы с вашего компьютера, поэтому этот пример создает скриптом короткий файл WAV прямо в браузере и использует его как src. Нажмите воспроизведение:

В Chrome, Firefox и Safari плеер выглядит по-разному, потому что каждый браузер рисует свой. Удалите controls, и плеер исчезнет, хотя аудио по-прежнему доступно для воспроизведения из JavaScript.

Атрибуты audio

АтрибутЧто делает
controlsПоказывает плеер браузера
autoplayПытается начать воспроизведение при загрузке (со звуком блокируется, см. ниже)
loopНачинает сначала, когда файл заканчивается
mutedЗапускает с выключенной громкостью
preloadnone (ничего не скачивать до воспроизведения), metadata (только длительность) или auto (решает браузер)
srcФайл для воспроизведения; или используйте дочерние <source> для нескольких форматов

Используйте preload="none" или "metadata" на страницах с множеством плееров, например в списке выпусков подкаста, чтобы страница не скачивала заранее каждый файл.

Форматы и запасные варианты

Перечислите несколько файлов в <source>, и браузер воспроизведет первый поддерживаемый. Текст внутри элемента показывается только в браузерах без поддержки <audio>:

<audio controls preload="metadata">
  <source src="episode.opus" type="audio/ogg; codecs=opus">
  <source src="episode.mp3" type="audio/mpeg">
  <p>Your browser cannot play audio. <a href="episode.mp3">Download the episode</a>.</p>
</audio>
ФорматMIME-типПримечания
MP3audio/mpegВоспроизводится во всех современных браузерах; надежный выбор, если файл один
AAC (.m4a)audio/mp4Широко поддерживается, хорошее качество при небольшом размере
Opus или Vorbis (.ogg, .webm)audio/ogg, audio/webmНебольшие файлы; добавьте MP3 как запасной вариант, потому что поддержка в Safari зависит от версии
WAVaudio/wavБез сжатия и большой; подходит для коротких звуковых эффектов

Почему не работает autoplay

Браузеры не позволяют странице самой начинать издавать звук. autoplay или вызов play() до того, как пользователь кликнул или коснулся экрана, отклоняется. Этот пример пытается воспроизвести звук при загрузке, выводит результат, а затем предлагает кнопку:

Обычно вы увидите NotAllowedError, ошибку, которую браузер выдает, когда блокирует воспроизведение. Кнопка работает, потому что клик считается разрешением. У каждого браузера есть свои дополнительные правила (Chrome, например, запоминает сайты, где вы часто воспроизводите медиа), поэтому никогда не полагайтесь на autoplay: запускайте звук по действию пользователя и всегда обрабатывайте промис, который возвращает play().

new Audio(url) создает элемент audio в JavaScript, не добавляя его на страницу, и это удобно для звуковых эффектов.

Собственные элементы управления

Скройте встроенный плеер, не указывая controls, а затем управляйте элементом через его JavaScript API: play(), pause(), currentTime, duration, volume и события вроде timeupdate и ended:

Кнопка это настоящий <button>, поэтому она работает с клавиатуры, а ее подпись переключается между Play и Pause. В конце файла браузер ставит элемент на паузу и вызывает ended, поэтому кнопка сама возвращается к Play. Если вы делаете свои элементы управления, то берете на себя и то, что встроенные давали бесплатно: поддержку клавиатуры, подписи и регулятор громкости.

Доступность

  • Никогда не запускайте звук сами. Он прерывает программы чтения с экрана и пугает людей. Запускайте аудио по клику.
  • Предлагайте расшифровку для подкастов и устной речи. Достаточно ссылки на текстовую версию под плеером, и поисковики смогут ее прочитать.
  • Оставляйте controls или делайте элементы управления из настоящих кнопок, чтобы аудио можно было поставить на паузу с клавиатуры.

Про видео со звуком, субтитры и постеры читайте на странице видео в HTML; у <audio> большая часть атрибутов и весь JavaScript API такие же.

Частые ошибки

  • Забытый controls. Без него элемент невидим, и кажется, что ничего не произошло.
  • Ожидание, что autoplay сработает. Запускайте воспроизведение по клику и обрабатывайте промис от play().
  • Неправильный путь или тип файла. Откройте URL файла напрямую, чтобы проверить его, и указывайте type в соответствии с реальным форматом (audio/mpeg для MP3).
  • Загрузка каждого файла в длинном списке. Используйте preload="none" или "metadata".
  • Фоновая музыка, которую нельзя остановить. Всегда давайте видимый способ поставить на паузу.

Часто задаваемые вопросы

Как добавить аудио на HTML-страницу?

Используйте <audio src="song.mp3" controls></audio>. Атрибут controls показывает плеер браузера с кнопкой воспроизведения, шкалой времени и громкостью. Без него элемент невидим.

Почему аудио не воспроизводится автоматически?

Браузеры блокируют аудио, которое начинается со звуком до того, как пользователь взаимодействовал со страницей. Запускайте воспроизведение по клику через audio.play(). Беззвучный элемент может воспроизводиться автоматически, но для аудио это редко полезно.

Какой формат аудио использовать в HTML?

MP3 воспроизводится во всех современных браузерах, поэтому это надежный выбор для одного файла. AAC в файле .m4a тоже широко поддерживается. Чтобы предложить несколько форматов, используйте элементы <source>.

Как зациклить аудио в HTML?

Добавьте атрибут loop: <audio src="rain.mp3" controls loop>. Когда файл заканчивается, он начинается сначала.

Как воспроизвести звук через JavaScript?

Создайте или выберите элемент audio и вызовите play(), например new Audio('click.mp3').play() внутри обработчика клика. play() возвращает промис, который отклоняется, если браузер блокирует воспроизведение.

Можно ли оформить аудиоплеер HTML?

Лишь немного: можно задать ширину, отступы и display, но кнопки внутри рисует браузер, и в каждом они выглядят по-своему. Для своего вида скройте controls и сделайте собственные элементы управления из кнопок и JavaScript API аудио.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ