Menu

HTML の audio タグ: 音声の埋め込み、controls、自動再生、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現在のどのブラウザでも再生できる。1 つだけなら安全な選択
AAC (.m4a)audio/mp4広く対応していて、小さいサイズでも音質がよい
Opus または Vorbis (.ogg、.webm)audio/ogg、audio/webmファイルが小さい。Safari の対応がバージョンによって違うので、MP3 を代替として並べる
WAVaudio/wav非圧縮で大きい。短い効果音には問題ない

自動再生されない理由

ブラウザは、ページが勝手に音を出し始めることを許しません。autoplay や、ユーザーがクリックやタップをする前の play() の呼び出しは拒否されます。この例は読み込み時に再生を試みて結果を出力し、その後でボタンを表示します。

たいていは、ブラウザが再生をブロックしたときのエラーである NotAllowedError が表示されます。ボタンが動くのは、クリックが許可とみなされるからです。ブラウザごとに独自の追加ルールがあります (たとえば Chrome は、よくメディアを再生するサイトを覚えています)。自動再生には決して頼らず、音はユーザーの操作から始め、play() が返す Promise を必ず処理しましょう。

new Audio(url) はページに追加せずに JavaScript で audio 要素を作るので、効果音に便利です。

独自のコントロールを作る

controls を省いて組み込みのプレーヤーを隠し、要素を JavaScript の API で操作します。play()、pause()、currentTime、duration、volume と、timeupdate や ended などのイベントです。

ボタンは本物の <button> なのでキーボードで操作でき、ラベルは Play と Pause で切り替わります。ファイルの終わりでブラウザが要素を一時停止して ended を発生させるので、ボタンは自動的に Play に戻ります。独自のコントロールを作ると、組み込みのものが何もしなくても提供していたキーボード操作、ラベル、音量調整も自分で引き受けることになります。

アクセシビリティ

  • 音を勝手に鳴らさない。 スクリーンリーダーの邪魔になり、人を驚かせます。音声はクリックから始めましょう。
  • ポッドキャストや話し声の音声には書き起こしを用意する。 プレーヤーの下にテキスト版へのリンクがあれば十分で、検索エンジンもそれを読めます。
  • controls を残すか、本物のボタンでコントロールを作る。 そうすればキーボードで音声を一時停止できます。

音声付きの動画、字幕、ポスターについては video タグ のページを参照してください。<audio> は属性のほとんどと JavaScript の API のすべてを video と共有しています。

よくある間違い

  • controls を忘れる。 これがないと要素は見えず、何も起きていないように見えます。
  • autoplay が動くと思う。 再生はクリックから始め、play() の Promise を処理しましょう。
  • ファイルのパスや type の間違い。 ファイルの URL を直接開いて確認し、type を実際の形式に合わせましょう (MP3 なら audio/mpeg)。
  • 長い一覧ですべてのファイルを読み込む。 preload="none" か "metadata" を使いましょう。
  • 止められない BGM。 一時停止する手段を必ず見える形で用意しましょう。

よくある質問

HTML のページに音声を追加するにはどうすればいいですか?

<audio src="song.mp3" controls></audio> と書きます。controls 属性で、再生ボタン、シークバー、音量のあるブラウザのプレーヤーが表示されます。これがないと要素は見えません。

音声が自動再生されないのはなぜですか?

ブラウザは、ユーザーがページを操作する前に音声付きで始まる再生をブロックします。代わりにクリックから audio.play() で再生を始めましょう。ミュートした要素なら自動再生できますが、音声でそれが役に立つことはまれです。

HTML ではどの音声形式を使えばいいですか?

MP3 は現在のどのブラウザでも再生できるので、ファイルが 1 つなら安全な選択です。.m4a ファイルの AAC も広く対応しています。複数の形式を用意するには <source> 要素を使います。

HTML で音声をループ再生するには?

loop 属性を付けます: <audio src="rain.mp3" controls loop>。ファイルが終わると最初からもう一度再生されます。

JavaScript で音を鳴らすには?

audio 要素を作るか選択して play() を呼びます。たとえばクリックの処理の中で new Audio('click.mp3').play() です。play() は、ブラウザが再生をブロックすると拒否される Promise を返します。

HTML の音声プレーヤーのデザインは変えられますか?

少しだけです。幅、margin、display は指定できますが、中のボタンはブラウザが描くので、ブラウザごとに見た目が違います。独自の見た目にするには、コントロールを隠し、ボタンと audio の JavaScript API で自分で作ります。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める